怎么旋转向量??,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,好么。 在这里感激不尽。 数学公式和说明就可以了。 非常感谢。
有两个在三维空间中的姿势(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;
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28