2017-09-10 14 views
1

3 점으로 정의 된 3D 평면이 있고 DirectXTK를 사용하여 4x4 행렬로 변환하고 싶습니다. - 이것은 매우 이상한 결과를 제공 DirectXTK/DirectXMath로 평면 변형하기

  1. 이 :: 비행기와 비행기를 변환() 메소드를 변환 :

    나는이 작업을 수행하는 두 가지 방법을 시도했다.

  2. 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

이가 전화를하기 전에 정규화가 필요하지있어 보인다. 그러나 Plane::Transform 상태 이에 대한 DirectXTK 위키 : 행렬의

평면은 역으로 변환되어야

트랜스, 이는 일본어와 같은 매트릭스 순수한 회전의 결과.

github.com/Microsoft/DirectXTK/wiki/Plane

1

:

정규화 평면 변환한다. 이 평면은 이미 정규화되어 있어야하며,이 방법을 호출하기 전에 법선 벡터의 단위 길이가 맞아야합니다.

정규화되지 않은 평면으로이 메서드를 호출하면 쓰레기가 발생합니다. 그래서 비행기를 먼저 정상화하고 다시 확인합니다. 당신이 DirectXTK PlaneTransform를 호출하기 때문에

Plane.Transform Method (Plane, Matrix)

+0

초기 평면은 [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

+0

비행기가 표준화되지 않았 음이 분명했습니다. 적어도 3 개의 벡터를 보면서. Plane :: Transform에 대한 DirectXTK wiki : * 평면은 행렬의 역 전치에 의해 변형되어야하며, 순수 회전의 경우 원래 행렬과 동일한 행렬이됩니다. * https://github.com/Microsoft/DirectXTK/wiki/Plot – yacc

+1

역전승은 그 트릭을 고마워했습니다. 이것을 확인할 수 있도록 별도의 답변으로 추가 하시겠습니까? – milkyway