Three.js 我如何用3J创建轴测斜/骑士/橱柜?

Three.js 我如何用3J创建轴测斜/骑士/橱柜?,three.js,axonometric,Three.js,Axonometric,我在中找到了有关如何创建(轴测)等轴测摄影机的示例,但如何创建轴测斜角?可以使用一个工作区渲染具有斜角的场景,在该工作区中,摄影机是正交摄影机,并且在渲染之前,网格的几何体通过剪切矩阵倾斜 // create shear matrix var alpha = Math.PI / 6; // or Math.PI / 4 var Syx = 0, Szx = - 0.5 * Math.cos( alpha ), Sxy = 0, Szy = - 0.5 * Math.si

我在中找到了有关如何创建(轴测)等轴测摄影机的示例,但如何创建轴测斜角?

可以使用一个工作区渲染具有斜角的场景,在该工作区中,摄影机是正交摄影机,并且在渲染之前,网格的几何体通过剪切矩阵倾斜

// create shear matrix
var alpha = Math.PI / 6; // or Math.PI / 4

var Syx = 0,
    Szx = - 0.5 * Math.cos( alpha ),
    Sxy = 0,
    Szy = - 0.5 * Math.sin( alpha ),
    Sxz = 0,
    Syz = 0;

var matrix = new THREE.Matrix4();

matrix.set(   1,   Syx,  Szx,  0,
            Sxy,     1,  Szy,  0,
            Sxz,   Syz,   1,   0,
              0,     0,   0,   1  );

// apply shear matrix to geometry                  
mesh.geometry.applyMatrix( matrix ); // this is the work-around
这是一本书


three.js r.72

基于@WestLangley的代码,这里介绍了如何在不修改几何体的情况下进行倾斜投影,而只修改相机的矩阵

//剪切矩阵
//参考:http://www.flipcode.com/documents/matrfaq.html#Q43
//| 1 Syx Szx 0|
//        |                  |
//| Sxy 1 Szy 0|
//M=||
//| Sxz Syz 1 0|
//        |                  |
//        | 0    0    0    1 |
//        |                  |
var alpha=Math.PI/6;//或者数学
var Syx=0,
Szx=-0.5*Math.cos(α),
Sxy=0,
Szy=-0.5*Math.sin(α),
Sxz=0,
Syz=0;
var矩阵=新的三个.Matrix4();
矩阵集(1,Syx,Szx,0,
Sxy,1,Szy,0,
Sxz,Syz,1,0,
0,     0,   0,   1  );
//将剪切矩阵应用于摄影机
摄像机.投影矩阵.乘法(矩阵);
camera.projectionMatrixInverse.getInverse(camera.projectionMatrix);
调用
camera.updateProjectMatrix()
后,您将对这些
projectionMatrix
进行修改。我查看了camera.updateProjectMatrix的代码以了解如何执行此操作,包括学习它存储的逆矩阵

这样做的一个小缺点是它会稍微移动视图,但您可以只移动摄影机位置或平截头体边界来说明这一点。(也许有更好的办法。)


three.js r.120

您是否愿意接受一种变通方法,即在渲染之前使用剪切矩阵扭曲网格的几何体,如中所示?是的,这是一种很好的变通方法,谢谢。我发布了一个记录该方法的答案。不幸的是,
THREE.BoxGeometry
scale.z
选项,例如,
box.scale.z=5
没有任何效果,因此您无法再更改BoxGeometry的
深度。在应用剪切矩阵之前,您可以这样做:
mesh.geometry.scale(1,1,2)等效地,将剪切矩阵第三列的元素乘以2。是的,在applyMatrix之前,我也可以使用常规构造函数参数,因为它将以任何方式新创建,但这正是我想要避免的。我只使用
scale.z.
在创建框后更改框的
深度
,因为在BoxGeometry中,构造函数的
深度之后无法更改。我想当它的深度发生变化时,我必须不断地破坏和重建它。