로프 물리 시뮬레이션을 C++ (스프링 물리학)으로 만드는 중입니다. 나는 몇 개의 "뼈"(위치, 무게 등이있는 일부 입자 [질량])로 구성된 기본 로프 이동을 성공적으로 구현했습니다. 각 파티클의 위치가 계산 될 때, 나는 스킨 된 메쉬 뼈대의 해당 뼈에 각각을 할당합니다. 내가 원하는 것은 그것의 자 입자로 회전되도록 입자의 회전을 계산하는 것이다 (원 뼈 [입자의 위치]의 머리, 검은 점은, 그 아이의 머리에 연결해야 꼬리입니다 등등 ...) : 그것을 불행하게도머리에서 꼬리까지 회전을 만드는 방법은 무엇입니까?
XMVECTOR q;
XMVECTOR a = XMVector3Cross(head,tail);
XMVECTOR lh=XMVector3Length(head),lt=XMVector3Length(tail),dot=XMVector3Dot(head,tail);
q.m128_f32[0] = a.m128_f32[0]; //assigning the x coordinate
q.m128_f32[1] = a.m128_f32[1]; //assigning the y coordinate
q.m128_f32[2] = a.m128_f32[2]; //assigning the z coordinate
q.m128_f32[3] = sqrt(pow(lh.m128_f32[0],2)*pow(lt.m128_f32[0],2)) + dot.m128_f32[0]; //assigning the w coordinate
return XMQuaternionNormalize(q);
: 은 좀 스레드를 보았다이 온 : Finding quaternion representing the rotation from one vector to another 내 프로젝트에 허용 대답을 구현하기 위해 노력했다, 그래서 나는이있어 어떤 이유로 든 나를 위해 일하지 않았으므로 실패한 다른 시도를했습니다.
XMVECTOR Head = XMVector3Normalize(head);
XMVECTOR Tail = XMVector3Normalize(tail);
float angle = acos(XMVector3Dot(Head,Tail).m128_f32[0]); //acos(dot(Head,Tail))
XMVECTOR axis = XMVector3Normalize(XMVector3Cross(Head,Tail));
XMVECTOR q = XMQuaternionRotationAxis(axis,angle);
누군가가 나에게 대안을 게시하고 가난한 페인트 기술에 대해 사과한다면 매우 감사 할 것입니다.
내가 그것을 밖으로 시도, 답변 주셔서 감사하지만, 출력은 여전히 수정되지 않고 (동일, 실제로되면서), 뼈는 주위 회전 보인다 무작위로하지만 알고 좋은, 문제는 다른 곳에 있음 그때. 또한 XMVECTOR에 직접 액세스하면 어떤 문제가 발생할 수 있는지 이해하지 못합니다. :) –
XMVECTOR 구성원의 내용은 XMFLOAT4 구조의 구조를 알고 예상 한대로 정렬되지 않습니다. 또한, XMVECTOR 구현의 세부 사항은 버전마다, 그리고 플랫폼마다 다를 수 있습니다. 마지막으로, 직접 액세스가 가장 자주 수행되면 성능이 저하됩니다. 자세한 내용은 [이 링크] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee420742(v=vs.85) .aspx)를 참조하십시오. – Alex
시뮬레이션이 완료된 후에 모든 뼈/입자/질량에 대한 절대 좌표가 있기 때문에 상위에주의하지 않고 두 지점 사이에서 회전을 설정하면됩니다.물론 첫 번째 뼈조차도 올바르지 않은 회전을합니다 (유휴 상태에서 X 축을 중심으로 약간 회전하고, 이상하게도 모든 다른 뼈와 함께합니다). 나는 그 문제가 여전히 다른 곳에 있다고 생각한다. –