Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用three.js r71合并两个几何图形或网格?

如何使用three.js r71合并两个几何图形或网格?
EN

Stack Overflow用户
提问于 2015-05-14 19:44:09
回答 3查看 42.7K关注 0票数 32

在这里,我遇到了问题,因为我需要将两个几何图形(或网格)合并为一个。使用早期版本的three.js有一个很好的函数:

代码语言:javascript
运行
AI代码解释
复制
THREE.GeometryUtils.merge(pendulum, ball);

然而,它不再在新版本中。

我尝试用以下代码合并pendulumball

ball是一个网格。

代码语言:javascript
运行
AI代码解释
复制
var ballGeo = new THREE.SphereGeometry(24,35,35);
var ballMat = new THREE.MeshPhongMaterial({color: 0xF7FE2E}); 
var ball = new THREE.Mesh(ballGeo, ballMat); 
ball.position.set(0,0,0);

var pendulum = new THREE.CylinderGeometry(1, 1, 20, 16);
ball.updateMatrix();
pendulum.merge(ball.geometry, ball.matrix);
scene.add(pendulum);

毕竟,我得到了以下错误:

代码语言:javascript
运行
AI代码解释
复制
THREE.Object3D.add: object not an instance of THREE.Object3D. THREE.CylinderGeometry {uuid: "688B0EB1-70F7-4C51-86DB-5B1B90A8A24C", name: "", type: "CylinderGeometry", vertices: Array[1332], colors: Array[0]}THREE.error @ three_r71.js:35THREE.Object3D.add @ three_r71.js:7770(anonymous function) @ pendulum.js:20
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-14 19:54:24

最后,我找到了一个可能的解决方案。我发帖子是因为我浪费了很多时间,但它对其他人很有用。棘手的事情是关于处理网格和几何的概念:

代码语言:javascript
运行
AI代码解释
复制
var ballGeo = new THREE.SphereGeometry(10,35,35);
var material = new THREE.MeshPhongMaterial({color: 0xF7FE2E}); 
var ball = new THREE.Mesh(ballGeo, material);

var pendulumGeo = new THREE.CylinderGeometry(1, 1, 50, 16);
ball.updateMatrix();
pendulumGeo.merge(ball.geometry, ball.matrix);

var pendulum = new THREE.Mesh(pendulumGeo, material);
scene.add(pendulum);
票数 23
EN

Stack Overflow用户

发布于 2015-10-28 16:12:57

为了更清楚地解释大流士的答案(当我试图更新Doob先生的过程城市的一个版本以使用Face3盒子时,我一直在努力解决这个问题):

从本质上讲,您是将所有网格合并到一个几何体中。因此,例如,如果您想要合并长方体和球体:

代码语言:javascript
运行
AI代码解释
复制
var box = new THREE.BoxGeometry(1, 1, 1);
var sphere = new THREE.SphereGeometry(.65, 32, 32);

...into单个几何体:

代码语言:javascript
运行
AI代码解释
复制
var singleGeometry = new THREE.Geometry();

...you将为每个几何体创建一个网格:

代码语言:javascript
运行
AI代码解释
复制
var boxMesh = new THREE.Mesh(box);
var sphereMesh = new THREE.Mesh(sphere);

...then为每个调用单个几何体的合并方法,将每个几何体的几何体和矩阵传递给该方法:

代码语言:javascript
运行
AI代码解释
复制
boxMesh.updateMatrix(); // as needed
singleGeometry.merge(boxMesh.geometry, boxMesh.matrix);

sphereMesh.updateMatrix(); // as needed
singleGeometry.merge(sphereMesh.geometry, sphereMesh.matrix);

合并后,从单个几何体创建网格并添加到场景中:

代码语言:javascript
运行
AI代码解释
复制
var material = new THREE.MeshPhongMaterial({color: 0xFF0000});
var mesh = new THREE.Mesh(singleGeometry, material);
scene.add(mesh);

下面是一个工作示例:

代码语言:javascript
运行
AI代码解释
复制
<!DOCTYPE html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r77/three.js"></script>
<!-- OrbitControls.js is not versioned and may stop working with r77 -->
<script src='http://threejs.org/examples/js/controls/OrbitControls.js'></script>

<body style='margin: 0px; background-color: #bbbbbb; overflow: hidden;'>
  <script>
    // init renderer
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    // init scene and camera
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.01, 3000);
    camera.position.z = 5;
    var controls = new THREE.OrbitControls(camera)
   	
    // our code
    var box = new THREE.BoxGeometry(1, 1, 1);
    var sphere = new THREE.SphereGeometry(.65, 32, 32);

    var singleGeometry = new THREE.Geometry();

    var boxMesh = new THREE.Mesh(box);
    var sphereMesh = new THREE.Mesh(sphere);

    boxMesh.updateMatrix(); // as needed
    singleGeometry.merge(boxMesh.geometry, boxMesh.matrix);

    sphereMesh.updateMatrix(); // as needed
    singleGeometry.merge(sphereMesh.geometry, sphereMesh.matrix);

    var material = new THREE.MeshPhongMaterial({color: 0xFF0000});
    var mesh = new THREE.Mesh(singleGeometry, material);
    scene.add(mesh);

    // a light
    var light = new THREE.HemisphereLight(0xfffff0, 0x101020, 1.25);
    light.position.set(0.75, 1, 0.25);
    scene.add(light);
	
    // render
    requestAnimationFrame(function animate(){
	    requestAnimationFrame(animate);
	    renderer.render(scene, camera);		
    })
  </script>
</body>

至少,这是我对事情的解释;如果我做错了什么,请向任何人道歉,因为我离成为three.js专家(目前正在学习)还差得远。当最新的版本打破了一些东西(合并的东西是其中之一,事实是three.js不再使用四边形来处理立方体-嗯-盒几何图形-这导致了获得阴影等各种乐趣)的时候,我只是“倒霉”了。

票数 40
EN

Stack Overflow用户

发布于 2018-07-29 20:35:12

这是我的终极精简版本,只有四(或五)行(只要材料在其他地方定义),使用了mergeMesh:

代码语言:javascript
运行
AI代码解释
复制
var geom = new THREE.Geometry();
geom.mergeMesh(new THREE.Mesh(new THREE.BoxGeometry(2,20,2)));
geom.mergeMesh(new THREE.Mesh(new THREE.BoxGeometry(5,5,5)));
geom.mergeVertices(); // optional
scene.add(new THREE.Mesh(geom, material));

编辑:添加了可选的附加线,以删除重复的顶点,这将有助于提高性能。

编辑2:我使用的是最新版本94。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30245990

复制
相关文章
关于python文件读写小结
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:
Lansonli
2021/10/09
3760
Python关于文件读写的操作
tell() 函数 : 获取要读取文件此时光标所在的位置。读取的位置和编码格式有关(gbk一个汉字占两个字节,utf-8一个汉字占用三个字节)
Java学术趴
2022/07/15
4600
Python关于文件读写的操作
Python|文件读写
Python中内置了文件读写的功能 核心:读写文件其实请求操作系统打开一个文件对象【文件描述符】
数据山谷
2021/01/22
1.5K0
python读写文件
本文系海特网编程技术斑竹Cute所发表,版权归海特网与Cute所有,转载请保留完整信息
py3study
2020/01/10
1.6K0
python如何读写excel文件「建议收藏」
为了方便演示,我这里新建了一个data.xlsx文件,第一个工作表sheet1区域“A1:F5”的内容如下,用于测试读excel的代码:
全栈程序员站长
2022/08/03
2.9K0
python如何读写excel文件「建议收藏」
Python文件读写
#文件操作,创建文件对象,通过open()函数创建文件对象 mode:代表文件要执行的操作的类型 r:读模式 w:写模式(每次写入文件之前都会先将文件中的内容清空,之后重新写入) a:添加模式(每次写入文件时,不会清空文件内容)
py3study
2020/01/15
9150
「Python」读写文件
每个运行在计算机上的程序,都有一个“当前工作目录”,或cwd。没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。os.getcwd() 函数获取当前工作路径的字符串,可以利用 os.chdir() 改变它。
AXYZdong
2022/05/05
3780
「Python」读写文件
「Python」读写文件
每个运行在计算机上的程序,都有一个“当前工作目录”,或cwd。没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。os.getcwd() 函数获取当前工作路径的字符串,可以利用 os.chdir() 改变它。
AXYZdong
2022/02/04
6410
python 文件读写操作
以前的代码都是直接将数据输出到控制台,实际上我们也可以通过读/写文件的方式读取/输出到磁盘文件中,文件读写简称I/O操作。文件I/O操作一共分为四部分:打开(open)/读取(read)/写入(write)/关闭(close)……
猿说编程[Python和C]
2020/03/03
1.5K0
python 文件读写操作
Python读写yaml文件
在我们做自动化测试中,可用作配置文件,配置一些服务器域名、mysql配置、登录信息、toekn等很方便快速读取
王大力测试进阶之路
2019/10/25
7940
python读写excel文件
第6行,xlrd.open_workbook打开一个已经存在的excel文件,文件不存在会造成打开失败。
py3study
2020/01/19
1K0
python读写json文件
上述文件截取自fastp软件产生的json输出结果,最外围是一个字典,而字典的值既可以是基本的数据类型,比如数值,字符串,又可以是列表,字典等数据结构,相互嵌套,就构成了整个json文件。
生信修炼手册
2020/05/18
2.4K0
python 文件读写操作
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:
狼啸风云
2020/12/01
7640
python 文件读写操作
Python文件读写操作
工作中,对文件的读写是非常频繁的,不管是从文件中读取数据,还是将数据写到文件中,都很频繁。本文介绍Python中的文件读写操作方法。
Python碎片公众号
2021/02/26
5890
Python文件读写操作
Python 7.1 文件读写
文件读写是我们最常见的IO操作。Python内置了文件读写的函数,用法和C是兼容的。
py3study
2020/01/07
5070
python 读写csv文件
Symbol,Price,Date,Time,Change,Volume "AA",39.48,"6/11/2007","9:36am",-0.18,181800 "AIG",71.38,"6/11/2007","9:36am",-0.15,195500 "AXP",62.58,"6/11/2007","9:36am",-0.46,935000 "BA",98.31,"6/11/2007","9:36am",+0.12,104800 "C",53.08,"6/11/2007","9:36am",-0.25,360900 "CAT",78.29,"6/11/2007","9:36am",-0.23,225400
用户5760343
2019/10/21
1.4K0
【Python】Python读写文件操作
http://blog.csdn.net/adupt/article/details/4435615
py3study
2020/01/14
7120
图解python | 文件读写
教程地址:http://www.showmeai.tech/tutorials/56
ShowMeAI
2022/02/23
4280
图解python | 文件读写
python 读写ini文件
如果某个section已经存在了,在写入的时候不能够再使用config.add_section(‘Title1’)这个函数了,这样会报错,所以,我们需要进行判断,先判断Title1是否存在,然后再进行操作 例子:
matinal
2023/10/14
2610
Python基础:文件读写
由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?有两种办法:
py3study
2020/01/14
3190

相似问题

能否接入萤石云的推流?

13.4K

微信和支付宝接入云支付是多久到账那?

0323

接入你们云IM能否提供技术支持人员?

4239

腾讯云支付怎么才可以接入除微信,支付宝以外的支付服务商?

0175

Rust口碑不错,为何学的人却很少?

087
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档