3 점으로 정의 된 3D 평면이 있고 DirectXTK를 사용하여 4x4 행렬로 변환하고 싶습니다. - 이것은 매우 이상한 결과를 제공 DirectXTK/DirectXMath로 평면 변형하기
- 이 :: 비행기와 비행기를 변환() 메소드를 변환 : 나는이 작업을 수행하는 두 가지 방법을 시도했다.
3 점을 변형하고 변환 된 점에서 평면을 작성하십시오.
void TestPlaneTransform()
{
Vector3 p1(-2.4f, -2.0f, -0.2f);
Vector3 p2(p1.x, p1.y + 1, p1.z);
Vector3 p3(p1.x, p1.y, p1.z + 1);
Plane plane(p1, p2, p3);
Matrix m = Matrix::CreateTranslation(-4, -3, -2);
// transform plane with matrix
Plane result1 = Plane::Transform(plane, m);
// transform plane with transposed matrix
Plane result2 = Plane::Transform(plane, m.Transpose());
// transform points with matrix
Vector3 t1 = Vector3::Transform(p1, m);
Vector3 t2 = Vector3::Transform(p2, m);
Vector3 t3 = Vector3::Transform(p3, m);
// plane from transformed points
Plane result3(t1, t2, t3);
result1.Normalize();
result2.Normalize();
result3.Normalize();
}
는 정상화 후 결과입니다
result1 x:-0.704918027 y:-0.590163946 z:-0.393442601 w:0.196721300
result2 x:1.00000000 y:0.000000000 z:0.000000000 w:-1.59999990
result3 x:1.00000000 y:0.000000000 z:0.000000000 w:6.40000010
비행기 :: 변환()을 DirectXMath 라이브러리의 일부이며, 그 문서는 단순히 "주어진 행렬 비행기를 변환 말한다 XMPlaneTransform를 호출합니다. ". 그 방법은 괜찮은 것 같아요,하지만 내 코드가 뭐가 잘못 됐나요? 사양에서
초기 평면은 [1.0, 0.0, 0.0, 2.4] 및 정규화이 값을 변경하지 않은 전화. 그건 그렇고, DirectXTK를 사용하는 동안 XNA 문서를 참조하는 것 같습니다. 기본적인 DirectXMath 메서드에 대한 문서에는 정규화 된 평면이 필요하다는 언급이 없습니다. https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.plane.xmplanetransform (v=vs.85).aspx – milkyway
비행기가 표준화되지 않았 음이 분명했습니다. 적어도 3 개의 벡터를 보면서. Plane :: Transform에 대한 DirectXTK wiki : * 평면은 행렬의 역 전치에 의해 변형되어야하며, 순수 회전의 경우 원래 행렬과 동일한 행렬이됩니다. * https://github.com/Microsoft/DirectXTK/wiki/Plot – yacc
역전승은 그 트릭을 고마워했습니다. 이것을 확인할 수 있도록 별도의 답변으로 추가 하시겠습니까? – milkyway