Three.js中的自定义形状

7
在我的项目中,我创建的形状是球体,并且我使用了一张图片作为材质...
如何创建自定义形状(不是球体、矩形等)?比如说,如何创建半球体?
目前我的代码:
// create a texture
texture = THREE.ImageUtils.loadTexture('red.png');

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

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

// create an object
mesh = new THREE.Mesh( geometry, material);
1个回答

20
在Three.js中,有多种使用几何图形的方法,从通过3D编辑器(例如Blender)导出的模型(导入模型)到从头开始创建几何图形。
其中一种方法是创建THREE.Geometry的实例,并添加顶点,然后确定这些顶点如何连接以添加面索引,但这不是一种简单的方法。
我建议从现有的几何图形(在extras/geometries包中找到,如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

将这个几何形状插入到你的网格中,就完成了!
可选择地,你可以使用GeometryUtils将网格/轴心居中。
THREE.GeometryUtils.center(geometry);

谢谢伙计...我可以看出你知道在说什么...那么你有想法如何使对象可拖动吗?我看到一些例子,发现它与Three.Ray有关...你对此了解吗? - BorisD
2
很高兴能帮到你。每当我想使用three.js做一些事情时,我都会先检查是否已经有了示例 :) webgl_interactive_draggablecubes 是开始的地方。你需要使用mouseup/mousedown/mousemove监听器。其思路是将鼠标的2D坐标基于相机转换为3D坐标,并通过深度在空间中“射”出一条射线。然后进行测试以检查该射线/直线上是否有任何对象(任何交点),如果有,则将SELECTED设置为列表中的第一个对象(如果有)...等等。 - George Profenza
长话短说,如果你将这三个监听器复制到你的项目中,并在顶部设置SELECTED、INTERSECTED和projector变量,它也应该在你的文件中正常工作。 - George Profenza
我一直在尝试寻找一些three.js的解决方案...但并不多。现在我正在查看这个网址:http://mrdoob.github.com/three.js/examples/canvas_interactive_cubes_tween.html...我想做类似的事情,但不是随机旋转立方体...我想知道点击了哪个对象,并将其拖动。 - BorisD
使用可拖动的立方体:这正是你所需要的。如果它是WebGL的问题,只需更改渲染器:renderer = new THREE.CanvasRenderer();//new THREE.WebGLRenderer( { antialias: true } );看起来可能不太漂亮,但它能工作。祝你好运! - George Profenza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接