软件渲染点:相机矩阵,并结合平移/旋转/缩放

时间:2018-04-13 04:22:14

标签: javascript matrix 3d

多年来我使用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;
}

1 个答案:

答案 0 :(得分:1)

  1. 是(也是“倾斜”) - 只有D维度空间需要(D+1) x (D+1)矩阵才能包含翻译(因为它不再是“线性转换”) 。

  2. “相机矩阵”有两个组成部分:

    • 查看矩阵V - 这是相机世界空间转换矩阵的反转;许多3D数学库提供了一个名为lookAt的函数来计算它。
    • 投影矩阵P - 这会进行透视转换。嗯,大部分;转换后仍然需要透视分割,然后在标准化设备坐标中给出XY(范围是[-1.0,1.0]或[0.0,1.0],具体取决于约定)。

    乘法的顺序是P * V * M,其中M是模型矩阵(应用于场景几何的变换)。对此的助记符为MVP,按照点上的操作顺序。

  3. 互联网上无数的资源;事实上,矩阵/向量代数的一小部分几乎总是任何游戏/图形编程书的第一章。