据我了解,Geometry存储顶点和面的javascript对象结构,BufferGeometry只通过Float32Arrays等存储原始gl数据.
有没有办法将标准几何转换为BufferGeometry,这是一个更小的内存紧凑与更少的对象?例如,如果我创建一个新的SphereGeometry,有没有办法轻松地将其转换为BufferGeometry?
据我所知,使用缓冲区几何可以提高性能并减少内存使用量,因为它可以降低将所有这些数据传递给GPU的成本.
正如我从@WestLangley所了解的那样:
THREE.BufferGeometry正在逐步取代,THREE.Geometry因为它在计算上更有效率.
我目前正在使用three.js - r72.
当我画我的几何形状使网格,并将它们添加到我看到有我的geomtries内两个属性的场景__directGeometry和_bufferGeometry.
在这里THREE.BoxGeometry:
在这里THREE.Geometry:
在这里THREE.ShapeGeometry:
我的问题:
THREE.DirectGeometry它是什么,它做什么?(我似乎无法找到任何关于此的文件)THREE.BufferGeometry存储_bufferGeometry已经自动使用了吗?如果没有,我可以简单地使用它而不是几何来提高性能吗?THREE.BufferGeometryhas toGeometry和THREE.Geometryhas toBufferGeometry.如果我使用这种方法将所有常规几何转换为缓冲几何,与THREE.BufferGeometry从一开始绘制它们相比,它会给我相同的性能提升吗?THREE.BufferGeometry?THREE.Geometry赞成THREE.BufferGeometry?注意:我找不到有关何时以及如何使用缓冲区几何形状或何时更换的详细信息THREE.Geometry.但如果某人有良好的来源或参考,请发表评论.
我有许多BufferGeometries,它们包含一个场景,并且它们的网格已经被转移到不同的位置.我想知道是否有一种方法可以从包含BufferGeometries的网格导出这个场景到STL文件.非常感谢你.
javascript three.js stl-format stl-fileformat buffer-geometry
我正在寻找一种最有效的方法来将大型多边形网格(最多1M个三角形)加载到Three.js.我正在考虑使用THREE.BufferGeometry对象或加载THREE.BinaryLoader.我的问题是:
THREE.BufferGeometry在下面创建了一个对象?或者它是否创造了同样有效的东西?一些额外的信息:
THREE.BufferGeometry.看起来我需要自己编写.但我可以准备服务器端的数据与THREE.BufferGeometry结构对齐.我以编程方式创建了一个简单的网格:
var CreateSimpleMesh = new function () {
var xy = [],
maxX = 7,
maxY = 10,
river = [[0, 5], [0, 4], [1, 3], [2, 2], [3, 2], [4, 1], [5, 1], [6, 0]],
grassGeometry = new THREE.BufferGeometry(),
grassVertexPositions = []
this.init = function () {
for (i = 0; i < maxX; i++) {
for (j = 0; j < maxY; j++) {
xy.push([i, j])
}
}
for (var i = 0; i < xy.length; i++) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 BufferGeometry 中设置每个面的 UV 索引。
我从几何开始。我的几何体的每个面都有一个face.materialIndex对应的 UV 指数。我正在尝试将其转换为 BufferGeometry,然后将其映射face.materialIndex到BufferGeometry.
这是我到目前为止所拥有的:
// Convert geometry > buffergeometry
const bufGeo = new BufferGeometry().fromGeometry( geometry );
// Get an array of all the original geometry's indices...
const faceIndices = geometry.faces.map( face => face.materialIndex );
// Build a new array with the indices...
const indices = new Uint16Array( faceIndices );
// Apply to the BufferGeometry
bufGeo.setIndex( new BufferAttribute( indices, 1 ) );
Run Code Online (Sandbox Code Playgroud)
现在这似乎破坏了我的网格并使其根本无法绘制。我究竟做错了什么?
顺便说一句,在幕后,当 Geometry 转换为 BufferGeometry 时,Three.js 首先将其置于称为 …
我现在只是想知道究竟什么是"抵消"和"指数/指数".例如,在https://github.com/mrdoob/three.js/blob/dev/src/core/BufferGeometry.js中提到偏移量,并且IndexedGeometry中提到了索引,但是我现在无法在开发树中找到它.虽然指数似乎相当明显,虽然我可以深入研究代码,为自己找出一些可能正确的答案,但我很想听到"官方"声明:)
谢谢!
我使用STLLoader将stl加载到返回BufferGeometry的ThreeJS场景上。
然后我用
myMesh.position.set( x,y,z )
myMesh.rotation.setFromQuaternion ( quaternion , 'XYZ');
Run Code Online (Sandbox Code Playgroud)
平移几何。这有效地改变了
myMesh.position
myMesh.quaternion
Run Code Online (Sandbox Code Playgroud)
翻译正在现场进行,并且一切正常。我期望
myMesh.geometry.attributes.position.array
Run Code Online (Sandbox Code Playgroud)
翻译前后会有所不同-但仍然相同。我想在翻译后从buffergeometry中提取新的veritces。我试图打电话
myMesh.geometry.dynamic = true;
myMesh.geometry.attributes.position.needsUpdate = true;
Run Code Online (Sandbox Code Playgroud)
在渲染循环中,但是没有运气,因为我还没有明确更新顶点。
我目前正在使用 Three.js 几何类来创建一个形状,然后对该形状执行多个 CSG 操作。从而不断地重绘形状。
执行多个 csg 操作的过程很慢,因为我使用光线投射来获得点击形状并执行所选形状和预定义形状(任何形状或几何体)的 CSG。
所以我的问题是:
使用缓冲区几何会加速我的 CSG,但是有没有任何库可以在THREE.BufferGeometry实例上执行 CSG 操作?
有没有办法可以通过使用任何其他方法来加快这个过程?
这是我的代码流:
var objects = [];
init();
render();
function init(){
//scene and camera setup ... etc
var sphere = new THREE.SphereGeometry(200, 32, 32);
objects.push(sphere);
// raycasting config
// bind mouse click and move event
}
function onMouseDown() {
var intersects = raycaster.intersectObjects(objects);
.....
// get intersected shape ..
// perfrom csg with predifend shape .
// Also contains steps to convert
geometry to *CSG …Run Code Online (Sandbox Code Playgroud) 我想让一个 DOM 节点在我的 THREE.js 模拟中跟踪一个粒子。我的模拟是使用 Points 对象构建的,使用 bufferGeometry。我正在设置渲染循环中每个顶点的位置。在模拟过程中,我移动/旋转相机和 Points 对象(通过其父 Object3d)。
我不知道如何为我的任何粒子获得可靠的屏幕坐标。我已经按照其他问题的说明进行操作,例如Three.JS: Get position of rotation object,以及使用 Projection 在 Three.js 中将世界坐标转换为屏幕坐标,但它们似乎都不适合我。在这一点上,我可以看到顶点的计算投影随着我的相机移动和对象旋转而变化,但不是我可以实际映射到屏幕的方式。此外,有时在屏幕上相邻的两个粒子会产生截然不同的投影位置。
这是我最近的尝试:
const { x, y, z } = layout.getNodePosition(nodes[nodeHoverTarget].id)
var m = camera.matrixWorldInverse.clone()
var mw = points.matrixWorld.clone()
var p = camera.projectionMatrix.clone()
var modelViewMatrix = m.multiply(mw)
var position = new THREE.Vector3(x, y, z)
var projectedPosition = position.applyMatrix4(p.multiply(modelViewMatrix))
console.log(projectedPosition)
Run Code Online (Sandbox Code Playgroud)
基本上我已经复制了着色器中的操作来派生gl_Position.
projectedPosition 是我想存储屏幕坐标的地方。
如果我错过了一些明显的东西,我很抱歉......我已经尝试了很多东西,但到目前为止没有任何效果:/
在此先感谢您的帮助。
buffer-geometry ×10
three.js ×10
javascript ×7
geometry ×1
indices ×1
mesh ×1
projection ×1
stl-format ×1
threecsg ×1
vertex ×1
webgl ×1