javascript - 通过添加默认高度 javascript 创建 3D 对象

标签 javascript arrays three.js

我有这段代码,应该创建一个 3D 表单。我的想法是,我将任何坐标存储到同一计划中的向量中,我应该添加默认高度以使其成为 3D。正如你所看到的,我是编程初学者,这是我第一次使用 ThreeJS,所以你能告诉我我做错了什么吗?老实说,我不知道,我想知道是否有另一种方法可以将默认高度添加到我的 2D 矢量坐标中,以便在不使用 ThreeJS 的情况下使其成为 3D 坐标。谢谢!

$(document).ready(function(){

function storeCoordinate(x, y, array) {
array.push(x);
array.push(y);
}

var coords = [];
var z=500;
storeCoordinate(3, 5, coords);
storeCoordinate(10, 100, coords);
storeCoordinate(30, 120, coords);
storeCoordinate(3, 5, coords);

for (var i = 0; i < coords.length; i+=2) {
    var x = coords[i];
    var y = coords[i+1];

    var canvas = document.getElementById('myCanvas');
        var ctx = canvas.getContext('2d');

        var shape = new THREE.Shape( coords );

        ctx.moveTo(coords[i],coords[i+1]);
        ctx.lineTo(coords[i+2],coords[i+3]);
        ctx.stroke();
}


  var render,mycanvas,scene,camera,renderer,light;


    init();
    animate();
  function init(){
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 1, 1000 );

    var extrudedGeometry = new THREE.ExtrudeGeometry(shape, {amount: 5, bevelEnabled: false});


    var extrudedMesh = new THREE.Mesh(extrudedGeometry, new THREE.MeshPhongMaterial({color: 0xff0000}));
    scene.add(extrudedMesh);


    document.body.onmousemove = function(e){
        extrudedMesh.rotation.z = e.pageX / 100;
        extrudedMesh.rotation.x = e.pageY / 100;
    }

    //lights

    dirLight = new THREE.DirectionalLight(0xffffff);
      dirLight.intensity = .9;
      dirLight.position.set(500, 140, 500);
      dirLight.castShadow = true;
      dirLight.shadowMapHeight =  2048
      dirLight.shadowMapWidth = 2048
      dirLight.shadowDarkness = .15

    spotLight = new THREE.PointLight( 0xffffff );
      spotLight.intensity = .5
      spotLight.position.set( -500, 140, -500 );
      camera.add( spotLight)
      camera.add(dirLight);


    lighthelper = new THREE.DirectionalLightHelper(dirLight, 20);
      lighthelper.children[1].material.color.set(0,0,0)
      lighthelper.visible = false;
      scene.add(lighthelper);


    ambientLight = new THREE.AmbientLight( 0x020202, 1 );
      scene.add( ambientLight );

    light = new THREE.PointLight(0xffffff);
    light.position.set(-100,200,100);
    scene.add(light);

    renderer = new THREE.WebGLRenderer({canvas: mycanvas});

    renderer.setSize( window.innerWidth, window.innerHeight );
    document.body.appendChild( renderer.domElement );

    controls = new THREE.OrbitControls(camera, renderer.domElement);
        controls.autoRotate = true;
        controls.enableZoom = true;
        controls.enablePan = true;
        controls.rotateSpeed = 3.0;
        controls.zoomSpeed = 1.0;
        controls.panSpeed = 2.0;
        controls.enableDamping = true;
        controls.dampingFactor = 0.25;
        controls.minDistance = 1.1;
        controls.maxDistance = 1000;
        controls.keys = [65, 83, 68]; // [ rotateKey, zoomKey, panKey ]
  }

  function animate() {
    window.requestAnimationFrame( animate );
    render();
  }

  function render() {
    renderer.render( scene, camera );
  }

  var loader = new THREE.OBJLoader();

});

最佳答案

只是一个如何使用 THREE.ExtrudeGeometry() 的选项:

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(0, 0, 3);
var renderer = new THREE.WebGLRenderer({
  antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var controls = new THREE.OrbitControls(camera, renderer.domElement);

var grid = new THREE.GridHelper(5, 10, "white", "gray");
grid.geometry.rotateX(Math.PI * 0.5);
scene.add(grid);

var points = [
  new THREE.Vector2(0, 1),
  new THREE.Vector2(1, 1),
  new THREE.Vector2(1, 0)
]

var shape = new THREE.Shape(points);
var extrudeGeom = new THREE.ExtrudeGeometry(shape, {
  amount: 0.5,
  bevelEnabled: false
});
var mesh = new THREE.Mesh(extrudeGeom, new THREE.MeshBasicMaterial({
  color: "aqua",
  wireframe: true
}));
scene.add(mesh);

render();

function render() {
  requestAnimationFrame(render)
  renderer.render(scene, camera);
}
body {
  overflow: hidden;
  margin: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/92/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>

关于javascript - 通过添加默认高度 javascript 创建 3D 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50435781/

相关文章:

javascript - three.js 如何制作纹理 "generated"纹理坐标,如 blender 循环

javascript - jqGrid动态设置colModels和colNames

javascript - 无法点击磁带中的新闻

javascript - 在 Polymer 中使用 core-ajax 的 CORS 错误

java - 将唯一点映射到唯一整数索引

javascript - 如何使用 javascript 迭代 HTML 实体

javascript - 围绕其自身的 y 轴旋转 Collada 模型

javascript - MongoDB Sum 与现有查询

javascript 令人惊讶的数组比较

javascript - 如何使用 three.js 将 Material (.mtl) 添加到对象 (.obj)?