【问题标题】:Problem in understanding three.js coordinate and axes system理解three.js坐标和轴系的问题
【发布时间】:2019-04-25 10:16:31
【问题描述】:

我有以下代码:

// coordinate values
var x1 = -815723.5125568421;
var y1 = 20538442.534868136;
var z1 = -17.439584224846456;
var x2 = -815723.5125568421;
var y2 = 20538443.164575472;
var z2 = -16.620415776398275;

// make a rectangular face parallel to y-z plane
var dummySquare = new THREE.Geometry();
dummySquare.vertices.push(new THREE.Vector3(x1,y1,z1));
dummySquare.vertices.push(new THREE.Vector3(x1,y1,z2));
dummySquare.vertices.push(new THREE.Vector3(x2,y2,z1));
dummySquare.vertices.push(new THREE.Vector3(x2,y2,z2));
dummySquare.faces.push(new THREE.Face3(0,1,2));
dummySquare.faces.push(new THREE.Face3(1,2,3));
var dummySquareMaterial = new THREE.MeshBasicMaterial( { color: "#0000FF", side: THREE.DoubleSide } );
var dummySquareMesh = new THREE.Mesh(dummySquare, dummySquareMaterial);

所以,我正在制作一个平行于 y-z 平面的矩形面。 在调试期间,我观察到以下内容:

顶点:数组(4)

0: p {x: -815723.5125568421, y: 20538442.534868136, z: -17.439584224846456}

1: p {x: -815723.5125568421, y: 20538442.534868136, z: -16.620415776398275}

2: p {x: -815723.5125568421, y: 20538443.164575472, z: -17.439584224846456}

3: p {x: -815723.5125568421, y: 20538443.164575472, z: -16.620415776398275}

位置:p {x: 0, y: 0, z: 0}

所以顶点符合预期。但是位置在(0,0,0)。我希望位置是由以上四个顶点定义的平面的中点。

我的理解中缺少什么?

另一个观察如下。

我像上面一样制作了两张脸(相同的顶点)。

对于两个面之一,我确定几何中心,将几何移动到原点(按中心的负值平移),用它创建一个网格,然后我移回原始位置:

var face = new THREE.Geometry();
....add vertices as code snippet above
var faceCentre = new THREE.Vector3();
face.boundingBox.getCenter(faceCentre );
face.translate(-faceCentre .x,-faceCentre .y,-faceCentre .z);
//make mesh
var faceMaterial = new THREE.MeshBasicMaterial( { color: "#FF0000", side: 
THREE.DoubleSide } );
var faceMesh= new THREE.Mesh(face, faceMaterial);
// move mesh back by setting its position to original centre of face
faceMesh.position.x = faceCentre .x;
faceMesh.position.y = faceCentre .y;
faceMesh.position.z = faceCentre .z;

如预期的那样,未移动的面与上面的面具有相同的顶点。

但其他面现在具有完全不同的顶点,即使两者都显示在相同的位置和相同的方向。

为什么顶点有这种差异?

【问题讨论】:

    标签: three.js


    【解决方案1】:

    THREE.js 使用对象及其翻译的分层表示。特别是,Object3D.position 通常不像你所说的那样是它在世界空间中的中间点,但它可以被视为存储对象当前平移的变量。它被称为它的本地位置。此翻译默认为(0,0,0)

    因此,当您通过几何体的顶点定义对象时,对象的顶点将在这些位置进行渲染。但是,如果您将.translate() 乘以(dx, dy, dz),则顶点(vx, vy, vz) 将在位置(vx+dx, vy+dy, vz+dz) 处渲染。

    类似地,其他转换也存储为对象的成员。当对象被变换时,几何的顶点不会改变,而是对象会跟踪其当前的局部变换,这些变换通常作为一系列矩阵乘法应用于顶点。使用这种逻辑,您可以在彼此内部定义一棵对象树,它们相对于其父对象具有局部变换,而后者又可能相对于其父对象进行变换等。这种表示对于稍微复杂的场景非常有用.

    这应该可以解释您的结果。例如,在您的第一个测试中,您成功地在您想要的位置创建了一个对象,但它的 position 仍然是 (0,0,0),因为它没有经过任何转换。

    【讨论】:

    • 顶点表示的是哪个坐标系?我做了一个立方体:
    • 定义几何图形时,其顶点在局部坐标系中表示。当您将对象直接放置在场景中的位置 p 处时,对象中的顶点 v 将在位置 p+v 上渲染。即,对象的局部坐标系由 p 平移。特别是,网格不会改变,只有对象跟踪的变换会发生变化
    • 感谢您的回复。所以这意味着虽然顶点在对象的局部坐标系(v)中表示,而对象的位置(p)在全局坐标系中表示。所以在全局坐标系中,一个顶点变成了p+v(基本向量代数规则)。非常感谢。
    • 我有疑问。当我执行geometry.translate() 时,为什么它不改变object.position?一个物体的位置不应该由它的顶点值来决定吗?
    • 啊,我认为这里混淆的主要来源是:THREE.js 中的几何图形不代表场景中的对象。它代表某种形状。您可以创建一个几何体,然后将相同的几何体分配给多个对象,所有对象都放置在不同平移(或其他变换,例如旋转或缩放)下的场景中。底层几何体将是相同的,但不同的“副本”可能经历了不同的转换。
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2017-03-27
    • 2015-02-03
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多