2010-08-11 6 views
3

지금까지 나는 회전을 위해 Quaternion을 생성 해 냈습니다. 이제는 문제가 발생합니다. 특정 큐브에만 어떻게 적용합니까? 현재 키보드의 오른쪽 키를 누를 때마다 모든 큐브가 원점을 중심으로 계속 회전합니다.XNA의 회전 큐브

참고로 Rubik 's Cube (2x2x2)와 비슷한 설정으로 8 개의 큐브를 배치했습니다. 따라서 오른쪽/왼쪽 화살표를 누르면 'Cube'의 오른쪽/왼쪽면 (8 개의 작은 입방체로 구성된 큰 입방체)이 시계 방향/반 시계 방향으로 90도 회전합니다.

선언 (총 여덟 개 큐브 만점) 큐브의 하나의 예 : 내 업데이트 방법에

GameObject subCube3 = new GameObject(); 
Vector3 subCube3Pos = new Vector3(-0.55f, -0.55f, 0.55f); 

:

// declare rotation floats  
float updownRotation = 0.0f;  
float leftrightRot = 0.0f;  

// get state of keyboard  
KeyboardState keys = Keyboard.GetState();  

// if key is pressed, change value of rotation  
if (keys.IsKeyDown(Keys.Right))  
{  
    leftrightRot = -0.10f;  
} 

// if key is pressed, change value of rotation  
if (keys.IsKeyDown(Keys.Left))  
{  
    leftrightRot = 0.1f;  
}  

// if key is pressed, change value of rotation  
if (keys.IsKeyDown(Keys.Up))  
{ 
    updownRotation = 0.1f;  
} 

// rotation around axis  
Quaternion addRot = Quaternion.CreateFromAxisAngle(new Vector3(1.0f, 0.0f, 0.0f), leftrightRot); 

//rotation of cubes  
cubeRotation = cubeRotation * addRot; 

내 그리기 기능 :

void DrawGameObject(GameObject gameobject) 
{  
    //graphics.GraphicsDevice.RenderState.CullMode = CullMode.None;  
    foreach (ModelMesh mesh in gameobject.model.Meshes)  
    {  
     foreach (BasicEffect effect in mesh.Effects)  
     {  
      effect.EnableDefaultLighting();  
      effect.PreferPerPixelLighting = true;  
      effect.World =  
       Matrix.CreateScale(gameobject.scale) *  
       Matrix.CreateFromQuaternion(cubeRotation) *  
       Matrix.CreateTranslation(gameobject.position);  

      effect.Projection = cameraProjectionMatrix;  
      effect.View = cameraViewMatrix;  
     } 
     mesh.Draw();  
    } 
} 

내가 생각하는 문제는 모든 내 큐브에 분명히 영향을 미치는 것은 Matrix.CreateTranslation(gameobject.position)입니다. 새로운 Vector3을 새로 만들려고 시도했습니다. 즉, c_component1 = Vector3.Transform(cube1pos, cubeRotation);이지만 그 위치에 넣고 실제로 사용하는 것이 확실하지 않습니다.

아무도 아이디어가 없습니까? 어떤 도움을 많이 주시면 감사하겠습니다.

+0

게시물을 편집하고 코드 서식을 수정하기에 충분한 담당자가 있었으면 좋겠다. –

+1

와우, 정말 무의미한 게시물에 감사드립니다.내 실제 질문 및 쿼리와 관련하여 말할만한 가치가없는 항목이 있다면 스레드에 게시 할 이유가 무엇입니까? 코드 형식에 대한 의견 외에도 도움을 줄 수 없다면 (파일에서 복사했기 때문에 분명히 이런 식으로) 다른 스레드를 트롤하십시오. 감사합니다. DaveT – DAVETELFA

+0

서식에 대한 제 의견은 개인적으로 받아 들여지지 않았습니다. 그러나 그것이 당신이 원하는 방식이라면 : 당신이 너무 게으르거나 당신의 글을 읽을 수있게하기에 부적합하다면, 그것은 당신에게 지적한 후에도 가능합니다 (포맷 도움은 찾기가 어렵지 않습니다!) 그리고 당신은 당신의 질문에 답하기위한 목적으로 시간을내어 (* 두 번 *) 누군가에게 욕설을 퍼붓고, 당신의 질문은 당신이 만든 스레드의 중간 * XNA 포럼에서 누군가가 당신을 돕기 위해 어떤 노력을 기울여야하는지에 대해서는 알지 못합니다. –

답변

0

회전하기를 원하는 특정 큐브를 클릭하거나 (초보자를위한 XNA에서는 꽤 어렵습니다) 키패드에서 몇 개의 숫자를 누르는 것과 같은 특정 큐브를 선택하려면 몇 가지 기술이 필요합니다. 그런 다음 각 GameObject에서 if 선택되어있는 경우에만 회전을 적용합니다. 이 말이

희망 ... 루빅 큐브 시나리오의

1

, 당신이 이미 가지고있는 쿠 아트뿐만 아니라, 각 작은 큐브에 대한 쿼터니언가 필요합니다. 이 작은 퀘스트는 전체 뱃치 (현재있는 퀘스트)에 대한 퀘스트와 퀘스트의 방향 차이를 나타냅니다. 뼈대와 달리 여기에서 계층 구조를 생각하십시오. 몇 개의 큐브 (예 : 왼쪽에있는 모든 것) 만 회전 시키려면 회전 큐브를 특정 작은 큐브의 퀘스트에 곱하면 나머지 큐브는 회전하지 않습니다.

그리기 위해 작은 큐브의 퀘스트를 큰 큐브의 퀘스트와 연결하여 최종 오리엔테이션 퀘스트를 만듭니다. 각 작은 큐브에 대해 그렇게하십시오.

모든 작은 큐브의 위치를 ​​나타내는 vector3에도 동일한 구조가 필요합니다.

그래서 SmallCube라는 클래스가 있고이를 8 번 인스턴스화했다고 가정 해 보겠습니다. 그것은 quat 및 Vector3 (위치에 대해)를 유지합니다.

큐브가 세계 원점 & 주위로 배치되었다고 가정하면 위쪽 만 회전하려고합니다.

Foreach(smallCube sc in smallCubes) 
{ 
    if(sc.Position.Y > 0.1f) 
    { 
    Quaternion addRot = Quaternion.CreateFromAxisAngle(Vector3.Up, MathHelper.ToRadians(90)); 
    sc.quat *= addRot 
    sc.Position = Vector3.Transform(sc.Position, addRot); 
    } 
} 

Matrices와 대조적으로 Quaternions를 사용하면 추가적인 이점이 있습니다. Quaternion.Dot() 메서드에 내장되어있는 것을 사용하여 해결할 수 있는지 테스트 할 수 있습니다. 모든 작은 큐브 방향이 동일한 경우 모든 색상이 정렬되어야합니다. 이 경우 모든 내적은 1.0f가됩니다. 행렬에는 동등한 기능이 없습니다.