【发布时间】:2018-07-28 17:24:06
【问题描述】:
我正在为我的项目自定义 three.js 中可用的转换控件。 我已经改变了旋转部分,现在正在处理翻译部分。 如果您在翻译 Gizmo 中注意到,中心有一个 XYZ 八面体。我已经删除了所有其他平面和箭头,并仅在该中心网格上编写了所有功能,这工作正常。 现在我只遇到一个小问题,那就是那个控制器的大小和位置。我将该 Octahedron 更改为 boxGeometry 并编写代码以使该控制器的大小与所选对象的大小完全相同。为此,我想使控制器的大小与 boxHelper 的大小相同,它们充当对象的轮廓。 当我在示例代码中尝试此逻辑时,我在其中创建了一个盒子,并获取盒子助手的大小并创建另一个相同大小的盒子,它工作正常。但是当我在threejs转换控件中编写相同的代码时,结果不一样。
下面是几何代码初始化
XYZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.1, 0.1, 0.1 ), pickerMaterial )]],
然后我在附加到任何对象时得到 box3 的大小
this.addBoxHelper = function () {
this.removeBoxHelper();
if(this.object.box3) {
**this.object.box3.getSize(selectionBoxSize);**
console.log(selectionBoxSize)
this.objectBoxHelper = new THREE.Box3Helper(this.object.box3, 0xffff00);
this.objectBoxHelper.canSelect = function () {
return false;
}
this.object.add(this.objectBoxHelper);
}
}
下面是我的变换控件的更新功能
this.update = function () {
if ( scope.object === undefined ) return;
scope.object.updateMatrixWorld();
worldPosition.setFromMatrixPosition( scope.object.matrixWorld );
worldRotation.setFromRotationMatrix( tempMatrix.extractRotation( scope.object.matrixWorld ) );
scope.object.box3.getSize(selectionBoxSize);
scope.object.getWorldPosition(selectionBoxPos);
camera.updateMatrixWorld();
camPosition.setFromMatrixPosition( camera.matrixWorld );
camRotation.setFromRotationMatrix( tempMatrix.extractRotation( camera.matrixWorld ) );
**scaleT = selectionBoxSize;**
//below three lines are for dynamic size change based on camera position..for
//next level functionality
//scaleT.x = worldPosition.distanceTo( camPosition ) / 6 * selectionBoxSize.x;
//scaleT.y = worldPosition.distanceTo( camPosition ) / 6 * selectionBoxSize.y;
//scaleT.z = worldPosition.distanceTo( camPosition ) / 6 * selectionBoxSize.z;
this.position.copy( selectionBoxPos );
this.scale.set( scaleT.x, scaleT.y, scaleT.z);
this.updateMatrixWorld();
下面是控制台日志的输出
TransformControls.js:526 Vector3 {x: 10.020332336425781, y: 2.621583938598633, z: 3.503500819206238}
TransformControls.js:601 Vector3 {x: 10.020332336425781, y: 2.621583938598633, z: 3.503500819206238}
如您所见,比例相同,但结果不同。在下图中查看结果。
正如您在图像中看到的那样,底部的红色框是翻译控制器,但比选择框小。 另一个问题是我的对象的枢轴位于底部,我希望这个控制器位于选择框的中心,而 box3 的 getCenter 方法也不会发生这种情况。
请帮忙!!如果我在解释问题时不清楚,请告诉我
【问题讨论】:
标签: javascript three.js transform