【问题标题】:three.js horizontal PlaneGeometry at x=0 y=0 z=0three.js 水平 PlaneGeometry 在 x=0 y=0 z=0
【发布时间】:2021-04-08 17:39:43
【问题描述】:

您好,我有这段代码可以绘制下面的图像

window.onload = function()
{
    // init renderer
    var renderer=new THREE.WebGLRenderer();
    canvas_width=side; canvas_height=side;
    renderer.setSize(canvas_width,canvas_height);
    document.body.appendChild(renderer.domElement);

    // init scene and camera
    var scene=new THREE.Scene();
    var camera=new THREE.PerspectiveCamera(90,canvas_width/canvas_height,1,100);
    camera.position.y=5;
    camera.position.z=25;

    var texture = new THREE.TextureLoader().load( 'arrow.png' );
    var img = new THREE.MeshBasicMaterial( { map: texture } );

    // mesh
    mesh = new THREE.Mesh(new THREE.PlaneGeometry(25,25),img);
    mesh.overdraw = true;
    scene.add(mesh);

    // a light
    var light=new THREE.HemisphereLight(0xffffff,0x000000,1.5);
    light.position.set(1,1,1);
    scene.add(light);

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

但我想水平而不是垂直地绘制 PlaneGeometry,而不是用mesh.rotation.x=THREE.Math.degToRad(-90); 旋转它,以便在 x=0 y=0 z=0 处得到这个:

这样用

mesh.rotation.x=THREE.Math.degToRad(-90);

箭头会向下

并与:

mesh.rotation.x=THREE.Math.degToRad(90);

箭头会向上

你能帮帮我吗?

【问题讨论】:

    标签: javascript 3d three.js


    【解决方案1】:

    你可以做到,用.rotateX()旋转几何:

    // init renderer
    var renderer = new THREE.WebGLRenderer();
    canvas_width = window.innerWidth;
    canvas_height = window.innerHeight;
    renderer.setSize(canvas_width, canvas_height);
    document.body.appendChild(renderer.domElement);
    
    // init scene and camera
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(90, canvas_width / canvas_height, 1, 100);
    camera.position.y = 5;
    camera.position.z = 25;
    
    var texture = new THREE.TextureLoader().load('https://threejs.org/examples/textures/uv_grid_opengl.jpg');
    var img = new THREE.MeshBasicMaterial({
      map: texture,
      side: THREE.DoubleSide
    });
    
    // mesh
    geom = new THREE.PlaneGeometry(25, 25);
    geom.rotateX(-Math.PI * 0.5); // this is how you can do it
    mesh = new THREE.Mesh(geom, img);
    mesh.overdraw = true;
    scene.add(mesh);
    
    // a light
    var light = new THREE.HemisphereLight(0xffffff, 0x000000, 1.5);
    light.position.set(1, 1, 1);
    scene.add(light);
    
    // render
    requestAnimationFrame(function animate() {
      requestAnimationFrame(animate);
      renderer.render(scene, camera);
    })
    body {
      overflow: hidden;
      margin: 0;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/92/three.min.js"></script>

    【讨论】:

    • 好的,但是如果我用mesh.rotation.x=THREE.Math.degToRad(-45);旋转它我就看不到它,好像另一边是黑色的
    • 我已经更新了 sn-p。在材料中添加了side: THREE.DoubleSide
    • 我尝试使用 THREE.BoxGeometry( 25,25,1) 而不是 THREE.PlaneGeometry(25,25) 给平面赋予厚度,但我想只在透明 png 图像的形状上使用它,在我的情况下是箭头,而不是在整个 25x25 正方形上。有可能吗?
    • @Miky 您可以创建另一个问题,其中包含所需结果的详细描述和图片 :) 但到目前为止,我从您的评论中可以理解的是,您正在寻找类似 @​​987654330@ 的东西和THREE.ShapeGeometry()/THREE.ShapeBufferGeometry()。看看这个example
    猜你喜欢
    • 2021-05-11
    • 2022-08-22
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2013-11-21
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多