应用three.js细分修改器而不更改外部几何体?

时间:2017-06-05 16:49:12

标签: javascript three.js geometry

我正在尝试使用任何three.js几何体并将其现有面细分为更小的面。这基本上可以使几何图形具有更高的分辨率"。在three.js的示例中有一个细分修改器工具,它非常适合我尝试做的事情,但它最终会改变并变形几何体的原始形状。我想保留原来的形状。

View the Subdivision Modifier Example

当前细分修饰符的行为示例:

enter image description here

我喜欢它的表现的粗略例子:

enter image description here

细分修饰符的应用方式如下:

let originalGeometry = new THREE.BoxGeometry(1, 1, 1);
let subdivisionModifier = new THREE.SubdivisionModifier(3);
let subdividedGeometry = originalGeometry.clone();
subdivisionModifier.modify(subdividedGeometry);

我试图挖掘source of the subdivision modifier,但我不确定如何修改它以获得所需的结果。

注意:细分应该可以应用于任何几何体。我想要的结果的例子可能会使得看起来具有增加的段的three.js PlaneGeometry可以工作,但我需要将它应用于各种几何。

2 个答案:

答案 0 :(得分:6)

根据TheJim01评论中的建议,我能够挖掘原始来源并修改顶点权重,边缘权重和β值以保留原始形状。我的修改应该删除任何平均值,并将所有权重放在源形状上。

有三个部分需要修改,所以我继续将它作为一个选项,可以传递给名为retainShape的构造函数,默认为false。

我对SubdivisionGeometry.js的修改代码做了一个要点。

<强> View the modified SubdivisionGeometry.js Gist

下面是一个关闭多维数据集的示例,关闭该选项并打开。

左: new THREE.SubdivisionModifier(2, false);

右: new THREE.SubdivisionModifier(2, true);

enter image description here

如果有人遇到任何问题或有任何疑问,请告诉我们!

答案 1 :(得分:0)

当前版本的three.js具有PlaneGeometry的可选参数,用于指定宽度和高度的段数;两者都默认为1。在下面的示例中,将widthSegments和heightSegments都设置为128。这与使用SubdivisionModifier的效果类似。实际上,SubdivisionModifier会扭曲形状,但是指定线段不会扭曲形状,并且对我来说效果更好。

var widthSegments = 128;
var heightSegments = 128;
var geometry = new THREE.PlaneGeometry(10, 10, widthSegments, heightSegments);
//    var geometry = new THREE.PlaneGeoemtry(10,10); // segments default to 1
//    var modifier = new THREE.SubdivisionModifier( 7 );
//    geometry = modifier.modify(geometry);

https://threejs.org/docs/#api/en/geometries/PlaneGeometry