怎么旋转向量??,face direction
求助:最近在做一些3D动画的东西,碰到一个问题,将姿势(posture)正规化(normalize)的问题,希望知道的朋友指点一下。现在将问题简单化如下:
有两个在三维空间中的姿势(posture)A,B。每个姿势都由20个点组成(骨骼)
例如姿势A就是20个点在三维空间的坐标的连接。B同样也是。
我现在要比较这两个姿势的相似度,直接用A,B对应点的坐标之差的总和来表示。
(A1-B1)^2+(A2-B2)^2+....+(A20-B20)^2
其中: Ai-Bi 表示点Ai的三维坐标x,y,z和点Bi的三维坐标x,y,z之差
现在碰到一个问题: 我要把这两个姿势A,B 正规化(normalize)才可以比较。
正规化的步骤是:1 把中心点A10,和B10都放到三维坐标系的原点(origin),简单的说就是把姿势A,B平移, 使得A,B的中心点A10,B10都在原点
2 找姿势A的面朝方向(face direction), 这个方向由点:(A5,A8,A14)组成的平面的法向量求得。 现在要把姿势B的方向也旋转成和A姿势的方向相同。
以上就是问题描述。 希望会的朋友给解答一下步骤1和步骤2,好么。 在这里感激不尽。 数学公式和说明就可以了。 非常感谢。
[解决办法]
友情帮顶一下
position_3d seld_pos;
position_id dist_pos;
dist_pos -= self_pos;
dist_pos.z = 0;
position_3d rot = dist_pos.normalize();
rot.z = 0;
[解决办法]
#include <d3dx9.h>#include <iostream>#include <math.h>using namespace std;ostream& operator << (ostream& os, D3DXVECTOR3 v) { os << "(" << v.x << ", " << v.y << ", " << v.z << ")"; return os;}ostream& operator << (ostream& os, D3DXVECTOR4 v) { os << "(" << v.x << ", " << v.y << ", " << v.z << ", " << v.w << ")"; return os;}ostream& operator << (ostream& os, D3DXMATRIX& m) { for (int i = 0; i < 4; ++i){ for (int j = 0; j < 4; ++j){ os << m(i, j) << " "; } os << endl; } return os; }float AngleBetween(const D3DXVECTOR3&left, const D3DXVECTOR3&right){ float len = D3DXVec3Length(&left) * D3DXVec3Length(&right); float f = D3DXVec3Dot(&left, &right)/len; float rad = acos(f); //float angle = rad * 57.2957795f; return rad;}int main(){ D3DXVECTOR3 A10(1, 0, 0); D3DXVECTOR3 A11(1, 1, 0); D3DXVECTOR3 Ori(0, 0, 0); D3DXVECTOR3 trans = Ori - A10; D3DXVECTOR3 newA10 = trans + A10; D3DXVECTOR3 newA11 = trans + A11; cout<<newA10<<endl; cout<<newA11<<endl<<endl; D3DXVECTOR3 faceNow(1, 0, 0); D3DXVECTOR3 faceTarget(8, 8, 8); D3DXVECTOR3 nowNormalized; D3DXVECTOR3 targetNormalized; D3DXVec3Normalize(&nowNormalized, &faceNow); D3DXVec3Normalize(&targetNormalized, &faceTarget); cout<<nowNormalized<<endl; cout<<targetNormalized<<endl; D3DXVECTOR3 axis; D3DXVec3Cross(&axis, &nowNormalized, &targetNormalized); float angle = AngleBetween(nowNormalized, targetNormalized); float cosTheta = cos(angle); float sinTheta = sin(angle); D3DXVECTOR3 axisnorm; D3DXVec3Normalize(&axisnorm, &axis); D3DXVECTOR3 tmp; D3DXVec3Cross(&tmp, &axisnorm, &nowNormalized); D3DXVECTOR3 final = nowNormalized * cosTheta + tmp * sinTheta + axis * D3DXVec3Dot(&nowNormalized, &axisnorm) * (1-cosTheta); cout<<final<<endl; D3DXMATRIX rotMat; D3DXMatrixRotationAxis(&rotMat, &axis, angle); D3DXVECTOR4 Q; D3DXVec3Transform(&Q, &faceNow, &rotMat); cout<<Q<<endl; return 0;}
[解决办法]
1.向量移动
2.任意轴旋转
[解决办法]
搜了一下,还可以生成一个旋转矩阵或者用四元数旋转。
http://blog.csdn.net/ccanan/article/details/5826561
------解决方案--------------------
坐标系之间的转化:http://blog.csdn.net/dizuo/article/details/6287637