首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

如何旋转向量?face direction

2012-02-12 
怎么旋转向量??,facedirection求助:最近在做一些3D动画的东西,碰到一个问题,将姿势(posture)正规化(normal

怎么旋转向量??,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;
[解决办法]

C/C++ code
#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

热点排行