在Three.js中渲染复杂模型

问题描述 投票:0回答:1

如果某个摇滚明星可以快速查看我的代码并告诉我为什么我无法渲染/查看我的three.js模型,我将永远为您效劳!我将发布整个脚本,但我认为一些初步信息很重要。基本上,我有成千上万个如下所示的点:

472232.14363148 2943288.56768013 200.129142"
472237.03086105 2943289.62356560 200.119496"
472241.91809061 2943290.67945108 200.109851"
472246.80532018 2943291.73533656 200.100205"
...and so on...

和一堆看起来像这样的脸:

["1021 1020 1061", "640 754 641", "1534 1633 1535", "4701 27 26", "654 753 655", ...and so on...

当我提取所有数据并正确配置它们后,我将其推到几何图形上并尝试将其添加到场景中,但没有成功。这是整个脚本:

var renderer = new THREE.WebGLRenderer();
  renderer.setSize( window.innerWidth, window.innerHeight );
  document.body.appendChild( renderer.domElement );

    var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
    camera.position.set( 0, 50, 50 );
    camera.lookAt( 0, 0, 0 );

    var scene = new THREE.Scene();

    var material = new THREE.MeshStandardMaterial( { color : 0x00cc00 } );

    var geometry = new THREE.Geometry();

    var points = bigData['LandXML']['Surfaces']['Surface']['Definition']['Pnts']['P']
    var faces = bigData['LandXML']['Surfaces']['Surface']['Definition']['Faces']['F']

  for(i=0;i<points.length;i++){
        var [point1,point2,point3] = points[i]['__text'].split(' ').map(Number)
        //point1 *= .00001
        //point2 *= .00001
        //point3 *= .00001
        geometry.vertices.push(new THREE.Vector3(point1,point2,point3))
    }

  for(i=0;i<faces.length;i++){
    console.log(faces[i]);
    var [face1,face2,face3] = faces[i].split(' ').map(Number)
    var face = new THREE.Face3(face1 - 1,face2 - 1, face3 - 1)
    geometry.faces.push(face)
  }

  scene.add( new THREE.Mesh( geometry, material ) );

您可以在for循环中找到这些点,我将它们乘以.00001来缩放模型,因为否则,如果这样有意义的话,数字太大了。我从每个面孔中减去1,因为数据不是零索引的。无论如何,如果有任何编码超级英雄花时间阅读本文并有一些见解,请帮帮我!谢谢!

javascript html web three.js 3d
1个回答
0
投票

所以,我在现场找到了您的模型,代码错过了这些部分:

  1. 您的模型具有较大的坐标,但尺寸较小。除后所有坐标为100.000,其boundingSphere中心位于(4.72;29,432; 0,00192)和boundingSphere半径0,00480,因此您需要转换模型使其中心在(0; 0; 0)或移动相机瞄准它的中心;
  2. geometry.computeFaceNormals()必须在构建面后调用为了使脸对照明和阴影具有吸引力;
  3. 场景需要一些光线。在当前状态下不会显示任何东西
  4. 添加网格后需要渲染循环或至少一次调用。

这里是固定代码,此外,我在相机距离下播放并添加了简单的旋转动画。我还使用了几何平移方法来进行适当的旋转:

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
    <meta charset="utf-8">
    <title>DXF Test</title>
</head>
<body>


<script src="three.min.js"></script>
<script type="text/javascript" src="JFM.js"></script>
<script>
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
    camera.position.set(0, 650, 650);
    camera.lookAt(0, 0, 0);

    var scene = new THREE.Scene();

    var material = new THREE.MeshStandardMaterial({color: 0x00cc00});

    var geometry = new THREE.Geometry();
    //geometry.vertices.push(new THREE.Vector3(4.72227256402, 29.4328751179, 0.00200138787));
    //geometry.vertices.push(new THREE.Vector3(3, 3, 0));
    //geometry.vertices.push(new THREE.Vector3(5, 6, 0));

    //var line = new THREE.Line( geometry, material );
    //scene.add( line );
    //renderer.render( scene, camera );

    var points = bigData['LandXML']['Surfaces']['Surface']['Definition']['Pnts']['P'];
    var faces = bigData['LandXML']['Surfaces']['Surface']['Definition']['Faces']['F'];

    console.log('Complete XML file');
    console.log(bigData);
    console.log('POINTS');
    console.log(points);
    console.log('FACES');
    console.log(faces);

    for (i = 0; i < points.length; i++) {
        var [point1, point2, point3] = points[i]['__text'].split(' ').map(Number);
        geometry.vertices.push(new THREE.Vector3(point1, point2, point3));
    }

    for (i = 0; i < faces.length; i++) {
        var [face1, face2, face3] = faces[i].split(' ').map(Number);
        var face = new THREE.Face3(face1 - 1, face3 - 1, face2 - 1);
        geometry.faces.push(face)
    }

    geometry.computeFaceNormals();
    geometry.computeBoundingSphere();
    // translate model so it's real center will be the same as mesh pivot
    geometry.translate(
        -geometry.boundingSphere.center.x,
        -geometry.boundingSphere.center.y,
        -geometry.boundingSphere.center.z
    );
    // compute bounding sphere again, because it was broken during translation
    geometry.computeBoundingSphere();

    var mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);

    var sunLight = new THREE.DirectionalLight(0xffffff);
    sunLight.position.set(200, 600, 1000);
    scene.add(sunLight);

    function animate() {
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
        mesh.rotation.y += 0.01;
        mesh.rotation.x += 0.01;
    }

    animate();


</script>
</body>
</html>

如果您不喜欢翻译,可以将其删除,删除旋转,然后在computeBoundingSphere之后执行以下操作:

camera.position.set(
          geometry.boundingSphere.center.x + geometry.boundingSphere.radius,
          geometry.boundingSphere.center.y + geometry.boundingSphere.radius,
          geometry.boundingSphere.center.z + geometry.boundingSphere.radius,
  );
  camera.lookAt(
          geometry.boundingSphere.center.x,
          geometry.boundingSphere.center.y,
          geometry.boundingSphere.center.z,
  );

希望它会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.