2013-08-21 3 views
0

간단한 모델을 연속적으로 이동하려고 할 때 문제가 있습니다. 큰 모델에 20 개의 작은 모델이 부착되어 있습니다. 그것은 본질적으로 여러 외부 대포를 가진 비행 접시입니다. this one과 같은 다른 질문을 보았습니다. 그 질문은 내가 원하는 것과 거의 비슷합니다. 그러나, 그것은 단지 draw 번역을 생성합니다. 독립적으로 파괴되어 충돌 감지가 필요하기 때문에 실제로는 3 차원 공간에서 자식 모델을 이동해야합니다.부모 개체로 자식 개체를 이동하면 회전합니다.

angle += 0.15f; 

RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * Matrix.CreateRotationZ(MathHelper.ToRadians(angle) * MathHelper.PiOver2); 

내가 솔루션을 많이 해봤지만, 위치는 항상 꺼져, 그래서 그들은 정말 부착 보이지 않는 : 나는 (업데이트() 함수에서) 부모를 회전하고있어 어떻게 여기입니다. 제가 가장 가까이에 있습니다 :

cannons[x].RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * 
Matrix.CreateRotationZ(MathHelper.ToRadians(angle + cannons[x].angle) * 
MathHelper.PiOver2); 

cannons[x].position.X = (float)(Math.Cos(MathHelper.ToRadians(angle + cannons[x].originAngle) * 
MathHelper.PiOver2) * 475) + position.X; 

cannons[x].position.Y = (float)(Math.Sin(MathHelper.ToRadians(angle + cannons[x].originAngle) * 
MathHelper.PiOver2) * 475) + position.Y; 

내가 그 코드에서 뭘 잘못 했습니까? 또는 내 접근 방식이 완전히 해제 된 경우이를 수행하는 올바른 방법은 무엇입니까?

답변

2

모든 것을 위해 매트릭스 변환을 사용해야합니다.

class Physics { 

public Vector3 Traslation; 
public Vector3 Scale; 
public Quaternion Rotation; 

public Physics Parent; 
public List<Physics> Children; 
public Matrix World; 


public Update() { 
     World = Matrix.CreateScale(Scale) 
       * Matrix.CreateFromQuaternion(Rotation) 
       * Matrix.CreateTranslation; 
     if (Parent!=null) { 
     World *= Parent.World ; 
     }  
     foreach (var child in children) child.Update();   
} 
} 

이 코드는 최적화되지 않았으며 개선 될 수 있음을 알 수 있습니다.

큰 모델에는 Physics 개체가 있어야하고 Parent 속성을 통해 큰 모델에 연결된 작은 모델에는 20 개의 Physics 개체가 있어야합니다.

절대 좌표로 객체에 대해 Traslation, Rotation 및 Scale이 필요한 경우 Matrix.Decompose 메소드를 사용할 수 있습니다. 월드 매트릭스를 셰이더에 전달하여 정점을 변환하는 것이 훨씬 좋습니다.

+0

이해할 수 있는지 잘 모르겠습니다. 이 코드를 사용하면 모든 위치 관련 코드를 완전히 교체하지 않아도됩니까? – Fibericon

+0

하위 위치는 상위 공간과 관련이 있습니다. 대용량 모델을 이동하고 변환을 업데이트하면 상위에 연결된 모든 항목이 변환을 변경하지 않고 이동되고 회전 및 배율도 동일하므로 하위 항목을 만들 필요가 없습니다. 삼각 함수가없는 솔루션에 대포 계산을 확장하십시오. – Blau

+0

+1. 오일러 각은 3D 수학에 적합하지 않습니다. 개인적으로, 규모, 회전 및 변환을위한 별도의 값보다는 단일 4x4 매트릭스를 사용했을 것입니다. 나는 쿼터니언이 지나치게 많다는 것을 알았고, 수학보다 더 추상적이고 매트릭스보다 복잡했습니다. 기본적으로 쿼터니언을 처리하는 GPU가 있습니까? 그냥 기다려 ...... ...... – Skizz

관련 문제