gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:45:03 25 4
gpt4 key购买 nike

我尝试使用矩阵旋转向量,但感到困惑。

我认为我需要做的就是创建一个旋转矩阵并将其乘以一个向量以获得旋转向量。

Here你可以看到我使用 Processing 完成的一个简单测试:

processing text

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

这是来源:

PVector[] clone,face = {new PVector(50,0,50),new PVector(-50,0,50),new PVector(-50, 0, -50),new PVector(50, 0, -50)};
color faceC = color(255,0,0),cloneC = color(0,255,0);
float angle = 90;
PVector x = new PVector(1,0,0),y = new PVector(0,1,0),z = new PVector(0,0,1), axis = x;
PFont ocr;

void setup(){
size(400,400,P3D);
strokeWeight(1.1610855);smooth();
clone = rotateVerts(face,angle,axis);
ocr = loadFont("ocr.vlw");
}
void draw(){
background(255);
fill(0);textFont(ocr,10);text("a = increment rotation\nx/y/z = change axis\nrotation: " + angle + "\naxis: " + axis,10,10,200,200);fill(255);
translate(width*.5,height*.5);
rotateX(map(mouseY,height*.5,-height*.5,0,TWO_PI));
rotateY(map(mouseX,0,width,0,TWO_PI));
drawQuad(face,faceC);
drawQuad(clone,cloneC);
stroke(128,0,0);line(0,0,0,100,0,0);stroke(0,128,0);line(0,0,0,0,-100,0);stroke(0,0,128);line(0,0,0,0,0,100);
}
void keyPressed(){
if(key == 'a') angle += 15;
if(angle > 360) angle -= 360;
if(key == 'x') axis = x;
if(key == 'y') axis = y;
if(key == 'z') axis = z;
clone = rotateVerts(face,angle,axis);
}
PVector[] rotateVerts(PVector[] verts,float angle,PVector axis){
int vl = verts.length;
PVector[] clone = new PVector[vl];
for(int i = 0; i<vl;i++) clone[i] = PVector.add(verts[i],new PVector());
//rotate using a matrix
PMatrix3D rMat = new PMatrix3D();
rMat.rotate(radians(angle),axis.x,axis.y,axis.z);
for(int i = 0; i<vl;i++) rMat.mult(clone[i],clone[i]);
return clone;
}
void drawQuad(PVector[] verts,color c){
stroke(c);
beginShape(QUADS);
for(int i = 0 ; i < 4; i++) vertex(verts[i].x,verts[i].y,verts[i].z);
endShape();
}

处理带有 PVectorPMatrix3D我用过。

我没有使用 PMatrix 他们应该使用它还是这是一个错误?有什么提示吗?

最佳答案

罪魁祸首是:

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;

将解决该问题。

关于3d - 如何在处理中使用矩阵旋转向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com