【问题标题】:Custom shapes in Three.jsThree.js 中的自定义形状
【发布时间】:2012-01-07 05:26:36
【问题描述】:

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

如何制作自定义形状(不是球体、矩形等)?例如,如何创建半球?

我现在的代码:

// 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);

【问题讨论】:

    标签: javascript 3d three.js


    【解决方案1】:

    在 Three.js 中有多种使用几何的方法,从通过 3D 编辑器(例如 Blender,已经存在一个不错的 Three.js exporter)导出模型,到从头开始创建几何。

    一种方法是创建 THREE.Geometry 的实例并添加顶点,然后计算它们如何连接以添加面索引,但这不是一个简单的方法。

    我建议从现有的几何图形(在 extras/geometries 包中找到)开始,例如 THREE.CubeGeometry、THREE.CylinderGeometry、THREE.IcosahedronGeometry、THREE.OctahedronGeometry 等)

    此外,还有一些非常不错的类可以让您生成挤压件 (THREE.ExtrudeGeometry) 和车床 (THREE.LatheGeometry)。对于挤压,请参阅this example

    您提到了创建半个球体。这是使用 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
    

    将该几何图形插入您的网格中,Bob 就是您的叔叔!

    或者,您可以使用 GeometryUtils 使网格/枢轴居中:

    THREE.GeometryUtils.center(geometry);
    

    【讨论】:

    • 谢谢伙计...我知道你知道你在说什么...所以你知道如何使对象可拖动吗?我看了一些例子,发现它与 Three.Ray 有关...你知道吗?
    • 很高兴它有帮助。每当我想用three.js 做某事时,我都会检查是否已经有一个示例:) webgl_interactive_draggablecubes 是开始的地方。您需要使用 mouseup/mousedown/mousemove 侦听器。这个想法是鼠标的 2D 坐标根据相机转换为 3D,并且光线在深度空间中“射出”。然后有一个测试来检查该射线/线(任何交叉点)上是否有任何对象,如果有,则将 SELECTED 设置为列表中的第一个对象(如果有)..etc
    • 长话短说,如果您将这 3 个侦听器复制到您的项目中,并且顶部有 SELECTED 和 INTERSECTED 和投影仪变量,它也应该在您的文件中工作。
    • 我一直在努力寻找一些three.js 的解决方案……但是没有多少。现在我正在看这个:mrdoob.github.com/three.js/examples/… 想做类似的事情,但不要随机旋转立方体...我想知道点击了什么对象并拖动它
    • 使用draggable cubes 之一:这正是您所需要的。如果它是 WebGL 的问题,只需更改渲染器:renderer = new THREE.CanvasRenderer();//new THREE.WebGLRenderer( { antialias: true } ); 看起来不那么漂亮,但它可以工作。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2016-10-31
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多