Three.js - 自定义形状?

Bor*_*isD 6 javascript 3d three.js

我是three.js的新手......到目前为止,我可以用摄像机视图创建形状,场景和游戏.

在我的项目中,我创建的形状是球体,我使用图像作为材料的纹理....

我的问题是如何制作自定义形状(不是球形,矩形......)?例如,我如何创建半球?

我现在的代码:

            // create texture
    texture = THREE.ImageUtils.loadTexture('red.png');      

    // create a sphere shape        
    geometry = new THREE.SphereGeometry( 50, 16, 16 );

    // give a shape red color
    material = new THREE.MeshLambertMaterial({map: texture});   

    // create an object
    mesh = new THREE.Mesh( geometry, material );
Run Code Online (Sandbox Code Playgroud)

Geo*_*nza 19

有三种方法可以在three.js中使用几何体,从通过3D编辑器(如Blender,已经存在一个漂亮的three.js导出器)导出模型到从头开始创建几何体.

一种方法是创建THREE.Geometry的实例并添加顶点,然后计算出这些连接如何添加面部索引,但这不是一种简单的方法.我建议从现有几何(在extras/geometry包中找到)开始,如THREE.CubeGeometry,THREE.CylinderGeometry,THREE.IcosahedronGeometry,THREE.OctahedronGeometry等)

此外,还有一些非常好的类允许您生成挤出(THREE.ExtrudeGeometry)和车床(THREE.LatheGeometry).对于挤压,请参见此示例.

你提到创建半个球体.这是使用LatheGeometry的理想选择.您需要做的就是创建一个半圆路径(作为Vector3实例的数组)并将其传递给车床,以便将半圆旋转为3D - 半球形.这是一个例子:

var pts = [];//points array - the path profile points will be stored here
var detail = .1;//half-circle detail - how many angle increments will be used to generate points
var radius = 200;//radius for half_sphere
for(var angle = 0.0; angle < Math.PI ; angle+= detail)//loop from 0.0 radians to PI (0 - 180 degrees)
    pts.push(new THREE.Vector3(Math.cos(angle) * radius,0,Math.sin(angle) * radius));//angle/radius to x,z
geometry = new THREE.LatheGeometry( pts, 12 );//create the lathe with 12 radial repetitions of the profile
Run Code Online (Sandbox Code Playgroud)

将那个几何体插入你的网格中,Bob就是你的叔叔!

您可以选择使用GeometryUtils使网格/枢轴居中:

THREE.GeometryUtils.center(geometry);
Run Code Online (Sandbox Code Playgroud)

玩得开心!

  • 很高兴它有所帮助.每当我想用three.js做一些事情时,我会检查是否有一个例子:) [webgl_interactive_draggablecubes](http://mrdoob.github.com/three.js/examples/webgl_interactive_draggablecubes.html)是开始的地方.您需要使用mouseup/mousedown/mousemove侦听器.这个想法是基于相机将鼠标2D坐标转换为3D,并且通过深度空间"射击"射线.然后有一个测试来检查该光线/线(任何交叉点)上是否有任何对象,如果是这样,SELECTED被设置为列表中的第一个对象(如果有的话)..等等 (2认同)