问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

有关计算机图形学的问题,点绕向量转后形成的新坐标

发布网友 发布时间:2023-06-14 07:41

我来回答

1个回答

热心网友 时间:2024-12-04 06:19

先把 op 取单位向量。再用下面的子程序。

你看一下 comp.graphics.algorithms 的 FAQ
5.01: How do I rotate a 3D point?

我把子程序列在这里,你看完后可以试一试。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define FPOINT double
#define ANGLE FPOINT
#define VECTOR QUAT
#define POINT VECTOR
typedef struct {FPOINT x,y,z,w;} QUAT;
enum Indices {X,Y,Z,W};
typedef FPOINT MATRIX[4][4];
#define MUL(a,b) ((a)*(b))
#define HALF(a) ((a)*0.5)
#define TWICE(a) ((a)*2.0)
#define COS cos
#define SIN sin
#define ONE 1.0
#define ZERO 0.0

QUAT MatrixFromAxisAngle(VECTOR axis, ANGLE theta, MATRIX m)
{
QUAT q;
ANGLE halfTheta = HALF(theta);
FPOINT cosHalfTheta = COS(halfTheta);
FPOINT sinHalfTheta = SIN(halfTheta);
FPOINT xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
q.x = MUL(axis.x,sinHalfTheta);
q.y = MUL(axis.y,sinHalfTheta);
q.z = MUL(axis.z,sinHalfTheta);
q.w = cosHalfTheta;
xs = TWICE(q.x); ys = TWICE(q.y); zs = TWICE(q.z);
wx = MUL(q.w,xs); wy = MUL(q.w,ys); wz = MUL(q.w,zs);
xx = MUL(q.x,xs); xy = MUL(q.x,ys); xz = MUL(q.x,zs);
yy = MUL(q.y,ys); yz = MUL(q.y,zs); zz = MUL(q.z,zs);
m[X][X] = ONE - (yy + zz); m[X][Y] = xy - wz; m[X][Z] = xz + wy;
m[Y][X] = xy + wz; m[Y][Y] = ONE - (xx + zz); m[Y][Z] = yz - wx;
m[Z][X] = xz - wy; m[Z][Y] = yz + wx; m[Z][Z] = ONE - (xx + yy);
/* Fill in remainder of 4x4 homogeneous transform matrix. */
m[W][X]=ZERO; m[W][Y] =ZERO;
m[W][Z]=ZERO; m[X][W] =ZERO;
m[Y][W]=ZERO; m[Z][W] = ZERO;
m[W][W] = ONE;
return (q);
}

QUAT MatrixFromAnyAxisAngle(POINT o, VECTOR axis, ANGLE theta, MATRIX m)
{
QUAT q;
q = MatrixFromAxisAngle(axis,theta,m);
m[X][W] = o.x-(MUL(m[X][X],o.x)+MUL(m[X][Y],o.y)+MUL(m[X][Z],o.z));
m[Y][W] = o.y-(MUL(m[Y][X],o.x)+MUL(m[Y][Y],o.y)+MUL(m[Y][Z],o.z));
m[Z][W] = o.x-(MUL(m[Z][X],o.x)+MUL(m[Z][Y],o.y)+MUL(m[Z][Z],o.z));
return (q);
}
#define SQRT sqrt
#define RECIPROCAL(a) (1.0/(a))
VECTOR Normalize(VECTOR v)
{
VECTOR u;
FPOINT norm = MUL(v.x,v.x)+MUL(v.y,v.y)+MUL(v.z,v.z);
/* Better to test for (near-)zero norm before taking reciprocal. */
FPOINT scl = RECIPROCAL(SQRT(norm));
u.x = MUL(v.x,scl); u.y = MUL(v.y,scl); u.z = MUL(v.z,scl);
return (u);
}
QUAT MatrixFromPointsAngle(POINT o, POINT p, ANGLE theta, MATRIX m)
{
QUAT q;
VECTOR diff, axis;
diff.x = p.x-o.x; diff.y = p.y-o.y; diff.z = p.z-o.z;
axis = Normalize(diff);
return (MatrixFromAnyAxisAngle(o,axis,theta,m));
}

void main()
{
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
空调加氟时要注意什么? 电脑安装了pr兼容性pr显示系统兼容性报告 带你了解——赫伯罗特 一千克面粉三十元一克面粉多少钱 大米2元500克面粉3元500克 2千克大米和和1500克面粉多少钱?_百度... ...面粉每千克多少元.大米25千克4.5元一千克面粉2 买8000克面粉需要32元,每千克面粉多少钱 500克面粉2元钱1千克面粉多少钱,怎么练式? 软棕和硬棕哪个好 amd rx6800m相当于nvidia什么水平? 我是外省想考华东师大的心理学.请教您! 跨专业考华东师大心理学研究生有什么限制吗?我是理科生。 铜壶烧水喝有什么副作用? 用铜壶烧水有什么禁忌 去河南沈阳郑州洛阳郑州洛阳有什么旅游景点 中牟有没有康丰药店康康风 东风汽车究竟有几个“风”, 护膝tpu和pp哪个材质好 浙江自考本科科目在哪查询? 浙江2023年专升本分数线会涨吗 长白山四季特征长白山哪里住方便-旅游指南 为什么西湖功夫茶的内容显示的是西湖工夫茶呢? 2022年西湖工夫法人代表是谁 昨天买了一罐西湖工夫茶给伯伯,但是伯伯肠胃不好,请问能喝吗?_百度... 北京金杜律师事务所地址 如何促进幼儿的社会性发展 幼儿园教师怎样做好孩子的全面发展 梦见男朋友捡到手表 运动简图怎么画? 机构运动简图是如何画出来的? v开头的计算机语言? 得伟压刨机故障 ...变压器等设备是有自己采购吗?还是有电业局采购?请指点! 骨瓷餐具质量如何如何选购骨瓷餐具 什么最能代表南京 除了桂花鸭能真正代表南京的东西? 什么元素最能代表南京?急求!!! 紫玫瑰泡水喝有什么功效,紫玫瑰泡水喝的功效是什么 用紫玫瑰泡水喝有什么功效 广告策略中不道德行为的具体表现? 管理道德的管理道德失衡的表现 广告从业人员的职业道德 只有一个人给市长热线反映事情会处理吗 关于分数或小数表示的信息 生活中分数或小数表示的信息有那些 成都医学院学校代码是多少(13705) 成都医学院读几年毕业 成都医学院有哪些 大连财经学院是什么学校? 盛世芳华最新食谱配方大全表分享盛世芳华最新菜谱清蒸武昌鱼/麻婆豆腐...