#c #directx
#c #directx
Вопрос:
Я работаю над кодом DirectX, который вычитает одну сетку из другой. Моя идея состояла в том, чтобы использовать функцию TriangleTests::Intersect из <DirectXCollision.h> и проверить, превышает ли результат длину вектора вершины, которую я использую для приведения луча (и если это так, я сокращаю длину до результата). Таким образом, вершины как бы «отталкиваются» второй сеткой . Однако это не работает, и я действительно не понимаю, почему.
{
XMFLOAT3 centroid = Centroid();
XMVECTOR vCentroid = XMLoadFloat3(amp;centroid);
float result, length;
for (autoamp; v : vertices)
{
XMVECTOR vPoint = XMLoadFloat4(amp;v.position);
for (int i = 0; i < shape.indices.size(); i = 3)
{
int index0 = shape.indices[i];
int index1 = shape.indices[i 1];
int index2 = shape.indices[i 2];
if (TriangleTests::Intersects(
vCentroid,
XMVector3Normalize(vPoint),
XMLoadFloat4(amp;shape.vertices[index0].position),
XMLoadFloat4(amp;shape.vertices[index1].position),
XMLoadFloat4(amp;shape.vertices[index2].position),
result)
)
{
XMStoreFloat(amp;length, XMVector3Length(vPoint));
if (length > result)
{
XMStoreFloat4(
amp;v.position,
XMVector3ClampLength(vPoint, result, result)
);
}
}
}
}
}
DirectX::XMFLOAT3 BaseMesh::Centroid()
{
float x, y, z;
x = y = z = 0.0f;
for (const autoamp; v : vertices)
{
x = v.position.x;
y = v.position.y;
z = v.position.z;
}
return { x / vertices.size(), y / vertices.size(),z / vertices.size() };
}
Комментарии:
1. Это концепция «реакции на столкновение» в игровой физике. Вы можете найти ряд книг и статей по этой теме в Интернете.