将THREE.ParametricGeometry的大小调整为边界框尺寸

时间:2017-02-24 18:29:41

标签: javascript graphics three.js

我的问题如下:

我有两个用THREE.ParametricGeometry创建的相交曲面。像这样:

Hyperbolic paraboloid and plane in the X axis.

我需要画出这两个表面的交点。使用Wolfram | Alpha API我得到交集函数并渲染它。像这样:

Intersection surface.

但是,正如您所看到的,交叉点网格比两个表面大得多。 所以我虽然可以计算表面边界框的交点(这个交点可以在上图中看到)和“限制”,可以说,交叉点网格到这个框的尺寸。

我已经尝试将交叉点网格的比例属性设置为边界框的尺寸(框的最大值和最小值之间的差值);但这只会使交叉点网格更大。

虽然我怎么能做到这一点?

交叉点网格就像这样创建(ThreeJS r81):

// 'intersections' is an array of mathematical functions in string format.
intersections.forEach(function (value) {
    var rangeX = bbox.getSize().x - (bbox.getSize().x * -1);
    var rangeY = bbox.getSize().y - (bbox.getSize().y * -1);
    var zFunc = math.compile(value); // The parsing is done with MathJS
    // 'bbox' is the intersected bounding box.                

    var meshFunction = function (x, y) {
        x = rangeX * x + (bbox.getSize().x * -1);
        y = rangeY * y + (bbox.getSize().y * -1);
        var scope = {x: x, y: y};
        var z = zFunc.eval(scope);

        if (!isNaN(z))
            return new THREE.Vector3(x, y, z);
        else
            return new THREE.Vector3();
    };

    var geometry = new THREE.ParametricGeometry(meshFunction, segments, segments,
        true);
    var material = new THREE.MeshBasicMaterial({
        color: defaults.intersectionColor,
        side: THREE.DoubleSide
    });
    var mesh = new THREE.Mesh(geometry, material);

    intersectionMeshes.push(mesh);
    // 'intersectionMeshes' is returned and then added to the scene.
});

1 个答案:

答案 0 :(得分:2)

我认为缩放交叉点网格不会起作用,因为交叉点会变得不正确。

让我们尝试使用Three.js clipping执行此操作:

  1. renderer.localClippingEnabled设为true;
  2. 计算曲面的边界框;
  3. 对于边界框的每6个边,计算一个正常指向内部框的平面。
    (例如右侧:new THREE.Plane(new THREE.Vector3(-1,0,0), -bbox.max.x);
    你现在有一组裁剪平面;
  4. 创建一个新的THREE.Material,其中material.clippingPlanes是剪裁平面数组;
  5. 将此材质用于交叉点网格。
  6. 请注意,对于局部剪切,交叉点网格和曲面网格应共享相同的世界变换。 (将所有这些网格放入THREE.Group将是合理的。)