3d 如何在处理过程中使用矩阵旋转向量?

3d 如何在处理过程中使用矩阵旋转向量?,3d,vector,matrix,geometry,processing,3d,Vector,Matrix,Geometry,Processing,我试图用矩阵旋转向量,但弄糊涂了 我想我需要做的就是创建一个旋转矩阵,然后将它乘以一个向量,得到旋转向量 您可以看到我使用以下工具完成的一个简单测试: 使用a增加旋转,使用x/y/z更改轴 以下是资料来源: PVector[]克隆,face={newpvector(50,0,50),newpvector(-50,0,50),newpvector(-50,0,-50),newpvector(50,0,-50)}; color faceC=color(255,0,0),cloneC=color(0

我试图用矩阵旋转向量,但弄糊涂了

我想我需要做的就是创建一个旋转矩阵,然后将它乘以一个向量,得到旋转向量

您可以看到我使用以下工具完成的一个简单测试:

使用a增加旋转,使用x/y/z更改轴

以下是资料来源:

PVector[]克隆,face={newpvector(50,0,50),newpvector(-50,0,50),newpvector(-50,0,-50),newpvector(50,0,-50)};
color faceC=color(255,0,0),cloneC=color(0255,0);
浮动角度=90;
PVector x=新PVector(1,0,0),y=新PVector(0,1,0),z=新PVector(0,0,1),轴=x;
PFont-ocr;
无效设置(){
尺寸(400400,P3D);
冲程重量(1.1610855);平滑();
克隆=旋转数(面、角度、轴);
ocr=loadFont(“ocr.vlw”);
}
作废提款(){
背景(255);
填充(0);文本字体(ocr,10);文本(“a=增量旋转\nx/y/z=更改轴\n旋转:“+角度+”\n轴:“+轴,10,10200200”);填充(255);
平移(宽度*.5,高度*.5);
rotateX(地图(鼠标,高度*.5,-高度*.5,0,两个圆周率));
rotateY(map(mouseX,0,width,0,TWO_-PI));
drawQuad(面,面C);
drawQuad(克隆,克隆);
行程(128,0,0);直线(0,0,0100,0,0);行程(0128,0);直线(0,0,0,0,-100,0);行程(0,0128);直线(0,0,0,0,0100);
}
按下void键(){
如果(键=='a')角度+=15;
如果(角度>360)角度-=360;
如果(键='x')轴=x;
如果(键='y')轴=y;
如果(键='z')轴=z;
克隆=旋转数(面、角度、轴);
}
PVector[]旋转顶点(PVector[]顶点、浮动角度、PVector轴){
int vl=垂直长度;
PVector[]克隆=新PVector[vl];
对于(int i=0;i而言,这是罪魁祸首:

rMat.mult(clone[i],clone[i]);
这样做是不安全的,因为与C或JAVA不同,源代码随着操作的进行而改变

将函数结尾更改为:

PVector[] dst = new PVector[vl];
for(int i = 0; i<vl;i++) dst[i] = new PVector();
for(int i = 0; i<vl;i++) rMat.mult(clone[i],dst[i]);
return dst;
PVector[]dst=新的PVector[vl];

对于(int i=0;i而不是PVector,您还可以使用toxiclibs几何体类,这将有助于简化整个语法:

import toxi.geom.*;

Vec3D[] rotateVerts(Vec3D[] verts, float angle, Vec3D axis){
  Vec3D[] clone = new Vec3D[verts.length];
  for(int i = 0; i<verts.length;i++)
    clone[i] = verts[i].getRotatedAroundAxis(axis,angle);
  return clone;
}
导入toxi.geom.*;
Vec3D[]旋转顶点(Vec3D[]顶点、浮动角度、Vec3D轴){
Vec3D[]克隆=新的Vec3D[verts.length];

对于(int i=0;iVery nice!谢谢!我在浏览文档()时发现headingXY、XZ、YZ非常方便。如果我有4个顶点和一条法线,如何获得Z轴上的旋转?如果我在法线上使用heading方法,Z将始终相同,因为我处理的是1个顶点。有什么提示吗?
Vec3D[] rotateVerts(Vec3D[] verts, float angle, Vec3D axis){
  Matrix4x4 mat=new Matrix4x4();
  mat.rotateAroundAxis(axis,angle);
  Vec3D[] clone = new Vec3D[verts.length];
  for(int i = 0; i<verts.length;i++) clone[i] = mat.applyTo(verts[i]);
  return clone;
}