三.JS旋转投影使y轴变成z轴

Posted

技术标签:

【中文标题】三.JS旋转投影使y轴变成z轴【英文标题】:Three.JS rotate projection so that the y axis becomes the z-axis 【发布时间】:2012-01-06 12:32:03 【问题描述】:

传统上,在 3D 投影中,Y 轴是代表“上下”的轴。我学会了用其他引擎把它想象成那个轴是 Z 轴。我想知道Three.JS 中是否有办法使 Z 轴成为“上/下”轴。如果是这样,有什么后果吗?

这是我想要的图表:

【问题讨论】:

对我来说,右边的图片似乎有“x”和“y”的位置错误。他们不应该交换吗? 您能否指出我可以在哪里阅读有关此公约的更多信息?我从来没有遇到过:-/ @Arman 如果我想在之后交换 x 和 y 轴,你有没有找到任何解决方案? @filip 你是什么意思?这张图片不是轴的旋转,它是“传统”的镜子,如果你想镜像事物,我认为你可以将它们在维度上缩放到负数。 【参考方案1】:

我在一个对象上遇到了这个问题。这是我修复它的方法。

object.rotation.z = 90 * Math.PI/180;
object.rotation.x = -90 * Math.PI/180;

这改变了它的方向,就像你问的那样。

【讨论】:

我正在寻找一种方法来改变整个坐标系,以便改变位置 y 和 z 会产生我所描述的变化。 这个解决方案帮助了我.. 谢谢【参考方案2】:

您可以只更改相机而不是整个坐标系。例如:

var WIDTH = 1024;
var HEIGHT = 768;
var VIEW_ANGLE = 45;
var ASPECT = WIDTH / HEIGHT;
var NEAR = 0.1;
var FAR = 10000;
camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR);
camera.position.z = 300;
camera.up = new THREE.Vector3( 0, 0, 1 );
scene.add(camera);

这会更改相机的up 向量以使用Z-UP。


编辑

为了举例说明,这里是您创建的 jsfiddle,在设置 up 向量后稍作修改以调用 lookAt:http://jsfiddle.net/NycWc/1/

【讨论】:

感谢您的回答!我现在没有时间测试它,但很快就会尝试。这对其他相机方法有什么影响吗?我还能正常使用lookAt吗? 嗯,我认为 lookAt 仍然可以工作,因为它使用相机的向上矢量:github.com/mrdoob/three.js/blob/master/src/cameras/… 也许我做错了什么,但我希望相机上升,而不是它似乎离开了jsfiddle.net/NycWc 你必须调用lookAt 设置up向量:jsfiddle.net/NycWc/1 如果您阅读了这个 9 年前的答案,请注意它不适用于 Threejs 的最新版本。请参考下面THREE.Object3D.DefaultUp的答案【参考方案3】:

xyz 坐标系应始终使用右手定则设置。创建自己的约定根本不是一个好的计划,并且会引起很多混乱。您可以随意旋转坐标系,但不要改变轴的方向。如果你真的想做你展示的东西,你可以制作一个 x,y,-z 坐标系。

【讨论】:

【参考方案4】:

以下将达到您想要的结果

THREE.Object3D.DefaultUp.set(0, 0, 1);

根据documentation

.DefaultUp : Vector3

对象的默认向上方向,也用作 DirectionalLight、HemisphereLight 和 Spotlight 的默认位置(创建从上向下发光的灯光)。 默认设置为 ( 0, 1, 0 )。

【讨论】:

这应该是正确的答案,接受的只是“破解”相机顶部值,而不是 OP 请求的整个坐标系(影响所有对象)。

以上是关于三.JS旋转投影使y轴变成z轴的主要内容,如果未能解决你的问题,请参考以下文章

three.js中的矩阵变换(模型视图投影变换)

绕单轴的旋转矩阵

四元数绕轴旋转的分量

如何制作用于围绕 z 轴旋转三角形的特征模型矩阵

如何在 SceneKit 中移动旋转的 SCNNode?

matlab 画图的时候,如何将向上的y轴坐标变成向下的?