three.js立方体几何 - 如何更新参数?

4
也许是个愚蠢的问题,但我还是要问一下。Three.js 几何图形有与之关联的“参数”字段,可以在此处查看盒子几何图形...

盒子几何图形参数

我正在尝试像这样更新这些参数...

var nodeSize = 10;
var geometry = new THREE.CubeGeometry(nodeSize, nodeSize, nodeSize);
mesh = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial({side:THREE.DoubleSide}));

scene.add(mesh);
mesh.geometry.parameters.depth=20;

当然,几何图形保持不变。是否有一种方法通过编辑这些参数来更新几何图形呢?
在此处查看示例:https://jsfiddle.net/kn3owveg/2/ 非常感谢您的帮助!

你试图通过更改 "depth" 字段来做什么?那个信息可能会有帮助。 - Giovazz89
感谢您的帮助@Giovazz89,我已经从收到的答案中制作了一个fiddle https://jsfiddle.net/henryJack/kn3owveg/6/ - henryJack
2
这绝不是一个愚蠢的问题。 - kandinski
我会使用几何重新分配而不是缩放,有关如何实现这一点的详细信息,请参见我的答案。 - Jacob Philpott
3个回答

2

parameters.depth只在几何构造时使用,修改它没有任何效果。你可以将其视为“只读”。

请使用右侧的GUI和BoxGeometry中的示例,了解如何实现您想要的效果。


确实,几何参数仅在构建时使用。链接的示例正在使用几何重新分配。有关如何实现此操作的详细信息,请参阅我的答案。 - Jacob Philpott

1

Gaitat 是完全正确的,你不能通过改变 参数 来改变几何形状。

还有另一种解决方案。通过缩放你的立方体。

function setSize( myMesh, xSize, ySize, zSize){
  scaleFactorX = xSize / myMesh.geometry.parameters.width;
  scaleFactorY = ySize / myMesh.geometry.parameters.height;
  scaleFactorZ = zSize / myMesh.geometry.parameters.depth;
  myMesh.scale.set( scaleFactorX, scaleFactorY, scaleFactorZ );
}
...
setSize(mesh, 10, 10, 20);

jsfiddle 示例


感谢您的帮助。我已经根据您的答案制作了这个 https://jsfiddle.net/henryJack/kn3owveg/6/。 - henryJack
我有雄心壮志,但并非聋子……你的语气中透露出那个挑战的结局,让我感到非常满意。正是我一直在寻找的……节省了我数天无意义的努力。问题是,我正在向参数化API提供一些基本算法,而我被它们的美所迷住……你怎么称呼它们?令人惊叹。我想实时调整算法以找到最佳范围……你怎么称呼它们?我看了你的简介……你知道我在追求什么。所以我可以在SO上发表有史以来最荒谬的问题,或者邀请你通过侧渠道回应……我更喜欢后者。 - kandinski
谢谢邀请。我会跟进并在整理好一些东西后向您发送示例。再次感谢。 - kandinski
从技术上讲,扩展只会产生更新几何图形的幻觉。我认为更好的方法是重新分配几何图形,有关如何实现此操作的详细信息,请参见我的答案。 - Jacob Philpott
通过上述方法,您可以更新几何图形的任何方面,包括深度分段。这在处理非立方体几何图形(如圆柱或球体)时特别有用。 - Jacob Philpott
显示剩余3条评论

0
从技术上讲,缩放只会产生更新几何图形的错觉。我认为更好的方法是将网格的几何值重新分配给新的几何体。
mesh.geometry = new THREE.CubeGeometry(newSize, newSize, newSize)

使用这种方法,您可以更新几何体的任何方面,例如深度段。 当处理非立方体几何图形(如圆柱体或球体)时,特别有用。

以下是使用此方法完全重做您原始代码的示例,实际上只更改了最后一行:

var nodeSize = 10;
var geometry = new THREE.CubeGeometry(nodeSize, nodeSize, nodeSize);
mesh = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial({side:THREE.DoubleSide}));

scene.add(mesh);
mesh.geometry = new THREE.CubeGeometry(nodeSize, nodeSize, 20);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接