2012-02-11 2 views
1

3D 자동차 모델을 이동하고 싶습니다. 왼쪽 또는 오른쪽 화살표 키를 누르면 각도가 바뀌고, 위쪽 화살표를 누르면 자동차가 움직입니다. XNA에서 3D 개체를 이동하는 방법?

업데이트 방법에 코드입니다 :

float dirX = (float)Math.Sin(angle); 
float dirY = (float)Math.Cos(angle); 

if (Keyboard.GetState().IsKeyDown(Keys.Up)) 
     { 
      position += new Vector3(-dirX, dirY, 0); 

      if (Keyboard.GetState().IsKeyDown(Keys.Left)) 
      { 
       angle += 0.015f; 
      } 

      if (Keyboard.GetState().IsKeyDown(Keys.Right)) 
      { 
       angle -= 0.015f; 
      } 
     } 

이것은 계산 부분이지만, 분명히 나는 ​​또한 화면에 차를 이동해야합니다. 나는 차가 앞으로 움직 이길 원한다. 그래서 X 축에서 90도 회전해야한다고 생각했다. 그리고 왼쪽이나 오른쪽 키를 누를 때 차를 돌리고 싶다.

는이 코드를 썼다 :

world = Matrix.CreateTranslation(position) * Matrix.CreateRotationY(angle) * Matrix.CreateFromAxisAngle(Vector3.UnitX, MathHelper.ToRadians(-90)); 

작동하지 않는, 아무도 말해 줄 수 내가 어떻게 이동할 수있다이 코드?

+0

"이 코드가 작동하지 않습니다"보다 구체적 일 수 있습니까? 정확히 무엇이 잘못 될까요? – ChrisF

+0

당신은 실제로 차의 매트릭스에 무엇인가하고 있습니까? – kevintodisco

+0

ChrisF : 내가 위로 밟고 떠났을 때, 차는 앞으로 나아 간다. 그러나 그것은 그 자체 주위를 회전한다. ktodisco는 : 자동차 매트릭스 세계 –

답변

3

Y 축은 실제로 "위로"(규칙에 따라)가 아니라 "앞으로"가 아니라는 점에 유의해야합니다. 이 문제가 많은 솔루션을 가지고 있지만, 당신 문제를 해결하는 가장 빠른 방법은 다음과 같습니다 그런

float dirX = (float)Math.Sin(angle); 
float dirZ = (float)Math.Cos(angle); 

position += new Vector3(dirX, 0, dirZ); 

, 올바른 순서로 변환 행렬을 곱해야합니다

Scale * Rotation * Translation 

귀하의 경우로 변환 :

// this will rotate car around the Y axis, and then translate it to correct location 
world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position); 

제안 사항 중 하나는 A- 유형을 제안하고 방향 * 속도를 사용하십시오.

관련 문제