2011-03-17 3 views
4

XNA에서 모델 회전에 관한 질문이 있습니다. 문제는 - 어떻게해야 (이 값을 변경해야하는 방법) 그런 식으로 녹색 모델을 회전하는 (빨간색 화살표) 무엇을 :XNA의 회전

DrawModel(elementD, new Vector3(-1, 0.5f, 0.55f), 0,-90,0); 

private void DrawModel(Model model, Vector3 position, float rotXInDeg, float rotYInDeg, float rotZInDeg) 
    { 
     float rotX = (float)(rotXInDeg * Math.PI/180); 
     float rotY = (float)(rotYInDeg * Math.PI/180); 
     float rotZ = (float)(rotZInDeg * Math.PI/180); 

     Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) *Matrix.CreateRotationX(rotX)*Matrix.CreateRotationZ(rotZ)* Matrix.CreateTranslation(position); 
     Matrix[] xwingTransforms = new Matrix[model.Bones.Count]; 
     model.CopyAbsoluteBoneTransformsTo(xwingTransforms); 
     foreach (ModelMesh mesh in model.Meshes) 
     { 
      foreach (BasicEffect effect in mesh.Effects) 
      { 
       effect.EnableDefaultLighting(); 

       effect.View = cam.viewMatrix; 
       effect.Projection = cam.projectionMatrix; 
       effect.World = (xwingTransforms[mesh.ParentBone.Index] * worldMatrix); 
      } 
      mesh.Draw(); 
     } 

    } 

:

http://img843.imageshack.us/i/question1.jpg/

코드 그리는 데 사용

Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) * Matrix.CreateRotationX(rotX) * Matrix.CreateTranslation(position) 
       * Matrix.CreateRotationX((float)(45 * Math.PI/180)) * Matrix.CreateRotationZ(rotZ) * Matrix.CreateRotationX((float)(-45 * Math.PI/180)); 

을 :

그래서 나는 약간 내 코드를 변경하여 솔루션을 적용하려 사실 rotZ 매개 변수를 변경하여 모델을 회전시킬 수있었습니다. 그러나 효과는 내가 달성하고자하는 것이 아니며 http://img225.imageshack.us/i/questionau.jpg/, 그것의 위치를 ​​바 꾸었습니다. 결함이있는 모델이나 다른 실수로 인한 것입니까? 나는 "원통"이 그 위치에 남아 있기를 원한다. 내가 어떻게 이럴 수 있니?

+0

답변을 upvote하거나 허용으로 표시 했습니까? 나는 당신이 여기에서 새로운 것을 본다. 그래서 upvotes가이 사이트를 움직이는 것 인 것을 기억해라. ... – Pedery

답변

1

회전 행렬을 사용한 회전은 계산적입니다. 따라서 모델을 "아래로"45도 회전하여 회전 행렬을 계산 한 다음 원하는 축을 중심으로 회전을 적용한 다음 모델을 다시 "위로"45도 회전시켜 회전 행렬을 계산할 수 있습니다. 이 세 행렬의 결과는 원하는 행렬을 제공해야합니다.

+0

나는 당신의 솔루션을 시험해보고 나의 첫 번째 포스트를 업데이트했다. 기대했던 결과에 좀 더 가까이 다가 감으로써 귀하의 의견에 진심으로 감사드립니다. – Konrad

+0

이동은 모델의 피벗 중심에서 이루어집니다. 자연스럽게, 코드는 단지 실린더의 축 주위로 합성 모델을 회전시키고 싶을뿐 아니라 전체 경계를 회전 시키려고한다는 것을 "추측"할 수 없습니다. 저는 XNA 전문가가 아니므로 모델의 회전 중심을 어떻게 설정할 수 있는지 알지 못합니다. 선택적으로 전체 모델의 범위, 실린더의 경계 및 회전 각도로부터 직접 계산할 수 있습니다. 이 경우 일련의 변환과 변환을 수행해야합니다. – Pedery

1

또 다른 옵션은 쿼터니언을 사용하여 회전 행렬을 생성하는 것입니다. 쿼터니온은 기본적으로 축이자 주위의 회전입니다. 이 경우 조작하기가 더 쉬울 수 있습니까?

+0

흥미로운 개념 :) http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation – Pedery