多年来我使用sin / cos来旋转点,而没有意识到通过使用矩阵,我可以使用相同的计算值来应用于共享共同旋转的每个点。所以我使用我新发现的(对我来说)旋转矩阵制作了一些JavaScript图形程序。结果令人印象深刻。
下面的代码是设置旋转矩阵的小类的一部分,并且在将该矩阵应用于3D点之后有一个函数。
下面我包含了我正在使用的“投影”代码。
1:我一直在读,有可能在一个矩阵中进行旋转/缩放/翻译!?在寻找一段时间之后,我还没有找到足够的东西来编辑使我的矩阵在下面的代码。
2:我很久以前就读过一个相机矩阵,但现在我意识到它可能与旋转矩阵类似?首先执行所有硬计算和慢速计算,然后将这些结果应用于所有数千个点 - 从而生成绘图就绪的2D屏幕坐标。
对于“简单”的旋转代码,这两个问题是否可行?
我可能会感到难过,但我发现想要在很多3D点上投射“3D相机矩阵”以获得透视正确2D点的选择非常令人兴奋!我可以加速很多旧的演示,并在它们周围进行有趣的相机移动。
提前感谢您的所有帮助!
https://codepen.io/SarahC/pen/xPGKWK?editors=0010
matrixRotate.prototype.makeMatrix = function(x, y, z){
this.cosa = Math.cos(z * this.radmod);
this.sina = Math.sin(z * this.radmod);
this.cosb = Math.cos(y * this.radmod);
this.sinb = Math.sin(y * this.radmod);
this.cosc = Math.cos(x * this.radmod);
this.sinc = Math.sin(x * this.radmod);
this.Axx = this.cosa * this.cosb;
this.Axy = this.cosa * this.sinb * this.sinc - this.sina * this.cosc;
this.Axz = this.cosa * this.sinb * this.cosc + this.sina * this.sinc;
this.Ayx = this.sina * this.cosb;
this.Ayy = this.sina * this.sinb * this.sinc + this.cosa * this.cosc;
this.Ayz = this.sina * this.sinb * this.cosc - this.cosa * this.sinc;
this.Azx = -this.sinb;
this.Azy = this.cosb * this.sinc;
this.Azz = this.cosb * this.cosc;
}
matrixRotate.prototype.rotate = function(x, y, z){
return {x: this.Axx * x + this.Axy * y + this.Axz * z,
y: this.Ayx * x + this.Ayy * y + this.Ayz * z,
z: this.Azx * x + this.Azy * y + this.Azz * z}
}
.
.
.
.
//Scale point for screen.
if (b.rotatedPoint.z < focalLength) {
b.scale = focalLength / (focalLength - b.rotatedPoint.z);
b.x = vanishingPoint.x + b.rotatedPoint.x * b.scale;
b.y = vanishingPoint.y + b.rotatedPoint.y * b.scale;
b.visible = true;
}
答案 0 :(得分:1)
是(也是“倾斜”) - 只有D
维度空间需要(D+1) x (D+1)
矩阵才能包含翻译(因为它不再是“线性转换”) 。
“相机矩阵”有两个组成部分:
V
- 这是相机世界空间转换矩阵的反转;许多3D数学库提供了一个名为lookAt
的函数来计算它。 P
- 这会进行透视转换。嗯,大部分;转换后仍然需要透视分割,然后在标准化设备坐标中给出XY(范围是[-1.0,1.0]或[0.0,1.0],具体取决于约定)。乘法的顺序是P * V * M
,其中M
是模型矩阵(应用于场景几何的变换)。对此的助记符为MVP
,按照点上的操作顺序。
互联网上无数的资源;事实上,矩阵/向量代数的一小部分几乎总是任何游戏/图形编程书的第一章。