2016-12-30 5 views
1

가져온 개체의 벡터를 만드는 데 시간을 보냈습니다. 플레이어 컨트롤을 완료하고 빌보드를 추가 할 수 있습니다. 이것은 MeshLoader 클래스와 OBJLoader 클래스를 사용하여 객체에로드 할 GameObject 클래스가 설정된 대학 프로젝트를위한 것입니다. 현재 .GetWorld()를 사용하고 있습니다. 그것은 나에게 세계의 객체의 데이터를 제공하는 XMFLOAT4X4를 반환합니다. 그런 다음 XMLoadFloat4X4를 사용하여 XMMATRIX로 변환 한 다음 해당 행렬의 데이터 행을 각 XMVECTOR로 가져옵니다. 나는 이것들을 시험해 보았고 그들이 올바른 순서에 있다고 믿지만 전진 키를 눌렀을 때 움직이지 않는 내 성격의 문제를 여전히 가지고있다. 나는 내가 완전히 잘못한 일을하고 있는지, 아니면 내가 방금 놓친 것을 놓친 지 궁금해했다.포워드 벡터를 따라 이동하고 가져온 모델 - DirectX11 C++

else if (GetAsyncKeyState(VK_UP)) 
{ 
    XMFLOAT4X4 currrentWorld = _zaz.GetWorld(); 
    XMMATRIX currentWorldM = XMLoadFloat4x4(&currrentWorld); 

    XMVECTOR scale = currentWorldM.r[1]; 
    XMVECTOR rotation = currentWorldM.r[2]; 
    XMVECTOR translation = currentWorldM.r[3]; 
    XMVECTOR forward = currentWorldM.r[4]; 

    forward = XMVector3Normalize(forward); 

    translation = XMVectorAdd(translation, forward); 

    newWorld = XMMATRIX(scale, rotation, translation, forward); 

    _zaz.SetWorld(&newWorld); 
    _zaz.UpdateWorld(); 
} 

다른 문제는 "_zaz.UpdateWorld(); 업데이트시 모든 키보드 컨트롤을 확인하더라도 내 업데이트 방법에서만 작동하는 것 같습니다.

void GameObject::UpdateWorld() 
{ 
    XMMATRIX scale = XMLoadFloat4x4(&_scale); 
    XMMATRIX rotate = XMLoadFloat4x4(&_rotate); 
    XMMATRIX translate = XMLoadFloat4x4(&_translate); 

    XMStoreFloat4x4(&_world, scale * rotate * translate); 
} 

void GameObject::SetWorld(XMMATRIX* world) 
{ 
    XMStoreFloat4x4(&_world, *world); 
} 

확실히 값을 읽는 중입니다. 위의 코드를 실행해야하는 "위로"키를 누를 때 게임이 중단됩니다. 모든 값이 설정됩니다. 자동차가 현재 회전하고 있습니다. 차를 약간 회전시킨 다음 게임을 중단하면 회전 및 앞으로 벡터가 변경됩니다. 어느 것이 좋을까요? 당신이 어떤 아이디어가있는 경우

The watch of all of the vectors after the second iteration of the elseif keypressed up code is called

는 대규모 도움이 될 것이다.

내 게임 오브젝트가에 의존하는 XMFLOAT4X4의 및 XMMATRIX의로, 쉽게 할 수 있던 카메라 데이터에 대한 XMFLOAT4 년대를 사용
else if (GetAsyncKeyState(VK_CONTROL)) 
{ 
    XMFLOAT4 position = _cameraFree.GetEye(); 
    XMFLOAT4 direction = _cameraFree.GetForward(); 

    position.x -= (direction.x * 0.05f); 
    position.y -= (direction.y * 0.05f); 
    position.z -= (direction.z * 0.05f); 

    _cameraFree.SetEye(position); 
    _cameraFree.CalculateViewProjection(); 
} 

지금까지 불가능했던 :

나는 그것과 유사 할 것이라고 가정 일하기 위해서. 제가 도움을 줄 수있는 정보가 더 있다면, 제발 말하십시오!

희망이 도움을 드리겠습니다.

+0

나는 _zaz가 장면 주위를 돌아 다니고 싶은 GameObject라는 것을 잊어 버렸다. –

+0

'UpdateWorld'에서'_world' 변수를 덮어 쓰지 않습니까? 'SetWorld'를 통해 설정된 것을 완전히 무시하고 "처음부터"재 계산하고 있습니까? – UnholySheep

+0

글쎄 그게 나 혼란 스러워요, UpdateWorld는 각각 –

답변

0

당신이 상상하는 방식은 currentWorldM입니다.

먼저 범위를 벗어나는 액세스를 수행하고 XMMATRIX::r은 4 개 요소이며 유효 범위는 [0..3]입니다.

둘째는, 4 × 4 매트릭스 그렇게 만들어지는 것이 아니다, 그것은 모든 것을 당신이 3 개 벡터 ijk 및 위치 O으로, 더 프레임처럼 볼 수 있고, 합병이 포함되어 있습니다. 그 중 하나는 앞으로 벡터, 하나는 오른쪽, 하나는 오른쪽 (또는 왼쪽)입니다.

스케일 행렬은 r[0].xr[1].yr[2].z, 예를 들어, 당신은 그 후, 그것은 전체 매트릭스에 분산되고, 회전과을 연결하지 않는 한이 한해 사실이다.

+0

나는 완벽하게 [0,3]과 아픈 사이에 있다는 요점을 놓쳤으니 XMMATRIX가 어떻게 작동하는지 더 자세히 조사해야합니다! 그러나 대답을 주셔서 감사합니다 –

+0

DirectXMath에 대한 [SimpleMath] (https://github.com/Microsoft/DirectXTK/wiki/SimpleMath) 래퍼를 살펴볼 수 있습니다. –