+ -
当前位置:首页 → 问答吧 → 怎么旋转向量??,face direction

怎么旋转向量??,face direction

时间:2011-10-03

来源:互联网

求助:最近在做一些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,好么。 在这里感激不尽。 数学公式和说明就可以了。 非常感谢。



作者: antony_y   发布时间: 2011-10-03

友情帮顶一下

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;

作者: oLINo   发布时间: 2011-10-03

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;
}


作者: HollyCpp   发布时间: 2011-10-04

热门下载

更多