three.js如何使曲面更平滑?

我的问题:最近,我在学习THREE.js为了可视化一个化学结构,像这样:n3
但是,为了使绘制的表面看起来更平滑,我选择使用尽可能多的三角形,这些三角形存储在BufferGeometry数据结构中。这导致了一个大问题:存储三角坐标的jso
文件非常大,甚至超过了200MB,这不利于网络传输,并且占用了大量存储空间。
因此,我想知道是否有3JS解决这个问题的方法?我曾经想知道是否可以使用少量的三角形坐标,然后使用插值生成更多的三角形,但似乎没有例子来说明我的假设过程,所以我发现很难做这种实验。这个问题可以解释为如何使下图中的曲面更加平滑。这样,我不需要大文件,但仍然可以看到平滑的表面。n1
这让我困惑了很长时间,有人能给我一些建议吗?非常感谢你,如果你能~
我想你正在寻找平滑/平均法线(增加启用平面着色的三角形数量将不起作用,你必须细分模型,直到每个三角形在任何屏幕上都近似于单个像素的大小。)
(1)如果你使用Blender创建模型,您只需选择模型,按F3(或space)并搜索Shade Smooth。
(2)如果模型是按三个步骤生成的,您可以尝试使用Geometry.computeVertexNormals8(生成几何图形后,只需执行一次即可):nmodel.geometry.computeVertexNormals();
此外,如果您在途中的某个地方启用它,确保模型材质的flatShading 10处于禁用状态。
导出模型时,每个三角形都是单独的,而不是共享顶点,因此每个面都有自己的垂直法线。这个问题似乎在OBJ格式中最为常见,但不是由它引起的,而是由建模软件导出引起的。
您应该尝试从创建它的软件中修复它,或者尝试使用>以连接共享相同位置的三元组,然后再连接yourGeometry.computeVertexNormals()。nmjurczyk:blockquote感谢您的友好回复,大约是任何屏幕上单个像素的大小,但实际上我的目的是使曲面更平滑,而不是连接具有相同位置的三角形。目前,我使用下面的code来存储几何数据:变量“positions”存储三角形“coordinates”,变量“normal”存储三角形的
ormal>
这样,三角形“coordinates”越多,曲面就越平滑。
正如您所见,当前曲面(下图)不够平滑。我想知道如何使它更平滑,使用插值或某种方式?
我没有使用Blender创建模型,只是一些三角形的坐标。
强烈建议共享顶点,它不会更改几何体三角形数,每个常规几何体都会执行此操作,除非对于不应共享UV或法线等属性的零件。
如果不共享顶点,您将无法使用computeVertexNormals,您只能根据创建几何体的方程式自己计算法线,以防万一。
您缺少的是索引,描述哪些属性形成三角形,而不是为每个三角形创建新的属性,这样也会大大减少内存。
是的,如果我没有误解你的意思,你是说通过共享顶点,我可以共享一些属性,例如,每个三角形的颜色,并由此减少内存?但是,除非我增加三角形的数量,否则此解决方案将无法平滑曲面?但是现在我只有少量的三角形坐标,但我希望曲面更平滑。我不想在视觉化时减少记忆,但是减少存储三角形坐标的文件的大小。
当前的问题是我无法获得更多三角形的顶点坐标,以获得每个三角形在任何屏幕上都近似于单个像素大小的结果。
绝对有不需要更多的三角形,有更多的三角形已经足够了。这里的平滑只意味着法线被加权/连续,对于某个位置的每个顶点都是一样的(因此你不应该在这里浪费内存),而在你的几何体中不是这样的,它们垂直于每个三角形。
因此,除了节省内存之外,你还可以得到一个平滑的曲面,您可以尝试此操作并查看>
您不需要合并顶点如果您在构建几何体时自己构建索引,那么自己计算法线并不总是可能的,而在computeVertexNormals中发生的事情是一个非常常见的常规问题用于计算平滑着色的平均法线的方法。
为了更好地理解法线,您可以查看法线辅助对象示例,红线指示法线对齐的方向,您可以看到,在曲面(如球体)上,在指向某个平均方向的位置上只有1,对于一个立方体,每个立方体的面都有3个锐利的边。
可视化的法线:Ayuuu:
当前的问题是,我无法获得更多三角形的顶点坐标,因此每个三角形在任何一个立方体上都近似于一个像素的大小屏幕。
只是为了澄清-“将三角形细分到每个像素大小”是绝对不严肃的-这就是为什么@Fyrestar和我都提到增加三角形数量不是正确的方法。
谢谢~
然后我修改了我的>
但是出现了一个错误:n<image1071×474但是geom已经被定义了,你知道会发生什么吗?nBufferGeometryUtils不是核心的一部分,您需要从examples文件夹中包含它:nexamples/js/utils/BufferGeometryUtils.js
工作得很好!非常感谢你
顺便问一下,你知道如何使它更平滑吗?凹陷的边缘看起来不柔和,有三角形的尖角。nimage835×631 KB
仅仅看它很难分辨,你能分享几何吗?从第一幅图像判断,可能是由于顶点太近而导致细节清晰且不匹配三角形顶点。
您可以增加mergeVertices中的tolerance参数。
我只能提供三角形的顶点坐标:nvertices_cart_fs.json(2.8 MB)
下面的code显示了我如何使用jso
文件提供的信息===平面[2][2]*fsScale;位置[=bx;位置[k+=cy;位置[k+8==0){color.setRGB(237/255,237/255,101/255);//yellow}如果(平面[0][3]==1),则为else{color.setRGB(204/255,25/255,204/255);//purple}如果(平面[0][3]==2),则为else{color.setRGB(0/255, 204/255, 204/255);//浅蓝色}else如果(平面[0][3]==3){color.setRGB(204/255,25/255,0/255);//红色}如果(平面[0][3]==4),则为else{color.setRGB(25/255,204/255,69/255);//绿色}else如果(平面[0][3]==5){color.setRGB(25/255,25/255,204/255);//深蓝色}颜色[=color.r;颜色[k+=color.g;颜色[k+=3.BufferGeometryUtils.mergeVertices(geom);几何计算顶点法线();似乎我将mergeVertices中的tolerance参数更改为0.001、0.01和1,因为默认值是0.0001,但是在我增加mergeVertices之后没有任何更改</image1071×474但是geom已经被定义了,你知道会发生什么吗?
How to make the surface smoother?n

three.js[已解决]正交摄影机的变换控件:gizmos缩放问题

您好,我正在使用带轨道控制的正交摄影机。我注意到当缩放照相机变焦不改变相机的位置(如透视相机)。首先,我想知道为什么这两个相机的实现方式不同?第二,我也在使用TransformControls,对于透视摄影机,更新功能上的小控件的重新缩放在这个等式中非常有效>但是使用OrbitControls更改缩放而不是正交摄影机的位置时,它没有正常工作。我试着像这样在等式中添加缩放,但没有得到任何好的结果>我应该以不同的方式包括它吗?我应该使用其他控件吗?谢谢大家的帮助!NaDaMa:首先,我很想了解为什么这两个摄像头...

日期:2021-12-11 08:00:01 浏览:1740

three.js多次渲染同一模型(obj模型),FPS要低得多

我试图在程序中渲染150个相同的树模型,但FPS突然从60下降到30+。你能告诉我什么是最好的解决办法吗?非常感谢。和平与爱。skr有两种典型的方法可以解决这个性能问题(太多的绘制调用):- 使用实例化渲染- 将所有几何体合并为一个几何体(因此只有一个网格)...

日期:2021-12-11 08:00:02 浏览:1746

three.js可缩放场景背景

three.js大家好,我有一个场景,由一个物体(反射雕像)组成,保持在一个漂亮背景的中心。我一直在使用威尼斯日落矩形hdr地图作为我的场景背景它既可以作为环境地图,也可以作为背景我看到背景不会与场景中渲染的网格一起缩放。这给人一种场景完全是假的感觉。i、 e状态向上/向下缩放,但背景不缩放。目前,我已经禁用了放大/缩小功能,这样用户就不会感到害怕。我的问题是:1. 当轨道控制放大/缩小时,我是否需要在此处使用一些着色器魔法来放大或缩小场景背景,以便看起来场景中的所有对象都在均匀缩放?或者这根本不可能做到?...

日期:2021-12-11 09:00:02 浏览:1272

three.js移动导入的Gltf模型

three.js我导入了我的gltf模型并将其添加到场景中,但现在如果我尝试移动它,它将不会=新建三、几何();var=混音器( 模型动画[0]>如何移动模式?Prakar_Srivastava:var>3D对象不能是Geometry或BufferGeometry类型。它应该是Object3D或类似Mesh、Points或Line的派生类的实例。在您的情况下,我只是这样声明变量:var mode;在动画循环中,执行以下操作:如果(mod!==未定义)>还请记住,基本3D场景的重要部分在代码片段中丢失(例如相...

日期:2021-12-11 10:00:01 浏览:1111

three.js平面明暗处理的问题

three.js嗨!我在项目中使用节点材质。我在模型渲染方面有问题。它看起来像是真实的平面阴影。如何平滑多边形?也有点像低分辨率阴影纹理贴图的自阴影。可能不是,但可能是。@Arkadiy\\u Vinkovskiy您需要在您的帖子中添加更多细节。屏幕截图不足以说明这里发生了什么。始终包括引起问题的代码,如果您使用的是模型,也要包括这些代码。更好的是,使用codepe制作一个工作示例...

日期:2021-12-11 10:00:02 浏览:997

three.js如何渲染立方体材质?

您好,直到昨天,我才相信Object3D是一组网格,而网格是一组几何体+材质,每个对象只有一个对象。我发现了立方体材质的结构,因此object3D的网格包含1个几何体(boxGeometry)和6个材质!所以问题是,这种网格的渲染效果如何?有关于它的文件吗?(这是为了提高我对three.js)非常感谢还有其他问题,与我的上一个帖子相关,如果一个网格中可能有多个材质,如何设置CustomDistanceMaterial以考虑所有材质的所有贴图?elysium11:所以问题是,渲染如何在这种类型的网格上工作?您...

日期:2021-12-11 11:00:03 浏览:858

three.js如何创建要在网格中拟合的线段

three.js伙计们,我想帮忙,假设我有一个这样的网格图像718×729 1.25 KB我想在网格面内创建线段,也就是说,我想将网格转换成这样的线图像710×828 740字节有人能帮忙吗???...

日期:2021-12-11 12:00:01 浏览:909

three.jsGLTFLoader.js这是我的登记簿错误

three.js每当我试着做决定的时候3.GLTFLoader对象我收到此错误代码:“未捕获类型错误:这是我的登记簿不是一个函数“我需要帮助!由Penta#u Trax在post#5中解决我最终发现我一直在使用错误的文件,当你需要使用jsm/example时,我使用的是js/example。其他东西也是个问题。但这是问题的基础。你能给我们看看你的代码吗?通常,如果你使用的是import语句,GLTFLoader不需要在前面加三个字符。好的,所以在这之前,我刚刚关注了这个视频,因为它是去年发布的。但是现在我试...

日期:2021-12-11 12:00:02 浏览:1069

three.js使用threejs的光流

嘿,我需要通过我的屏幕显示一束移动的光束。我不想使用任何模型或动画。我想知道我是否可以单独使用threejs来实现这一点。我也应该能够控制其运动的颜色强度和路径。嗨!也许这会有帮助:GitHub-jeromeetienne/三倍体积聚光灯: three.js扩展以提供体积聚光灯13,用于可视化光锥。您可以使用THREE.Curve()设置其路径。控制颜色强度,可能取决于曲线上的位置,也可以使用tween.js或者GSAP用于复杂的动画。创造力取决于您这是您想要的吗?https://threejs.org/e...

日期:2021-12-11 13:00:01 浏览:1316

three.js使用光线投射动态绘制多边形

我要画多边形three.js具有交点。为此,我使用下面的函数。首先,我使用光线投射器在第一个交点的第一个点添加球体。每次单击后,在交点处创建新球体,并在该交点和上一点之间创建线。现在,我希望在第一次单击时关闭多边形指向或单击该点周围。如何实现此目标。raycaster params是否与网格一起工作以检测鼠标位置周围的网格?function checkIntersectionclick() = raycaster.intersectObjects(addedObject, true);if (interse...

日期:2021-12-11 13:00:02 浏览:868