Three.js 从几何体对象的中心缩放它们

Three.js 从几何体对象的中心缩放它们,three.js,shader,glsles,buffer-geometry,Three.js,Shader,Glsles,Buffer Geometry,我在一个缓冲区几何体中有大量随机放置的圆。我试图根据他们中心的音频输入来缩放每一个,但他们一直在缩放场景的中心。它们不是变得更大的半径并且保持静止,而是变得更大,但也离中心更远 uniform float scale; varying vec3 color; void main() { mat4 sPos = mat4(vec4(scale,0.0,0.0,0.0), vec4(0.0,scale,0.0,0.0), vec4(

我在一个缓冲区几何体中有大量随机放置的圆。我试图根据他们中心的音频输入来缩放每一个,但他们一直在缩放场景的中心。它们不是变得更大的半径并且保持静止,而是变得更大,但也离中心更远

uniform float scale;
varying vec3 color;
void main() 
{

  mat4 sPos = mat4(vec4(scale,0.0,0.0,0.0),
               vec4(0.0,scale,0.0,0.0),
               vec4(0.0,0.0,1.0,0.0),
               vec4(0.0,0.0,0.0,1.0));
  vec3 pos = position * normal;
  vec4 modelViewPosition = modelViewMatrix * sPos * vec4(pos, 1.0) ;

  gl_Position = projectionMatrix * modelViewPosition;
}
这就是我正在尝试的。是否有一种矩阵变换可以将原点移动到每个圆的中心,而不会扰乱场景的其他方面

小尺度值

较大的比例值

添加正常*比例

uniform float scale;
varying vec3 color;
void main() 
{
  vec3 pos = position + normal * scale;
  vec4 modelViewPosition = modelViewMatrix * vec4(pos, 1.0) ;

  gl_Position = projectionMatrix * modelViewPosition;
}
例如:

常数vs=` 均匀浮标; 真空总管 { vec3位置=位置+正常*刻度; vec4模型视图位置=模型视图矩阵*vec4pos,1.0; gl_位置=投影矩阵*模型视图位置; } `; 常数fs=` 真空总管{ gl_FragColor=vec41,0,0,1; } `; 常量照相机=新的三个透视照相机40,1,1,1000; 摄像机位置z=400; const scene=新的三个场景; 警察制服={ 比例:{值:1}, }; var shaderMaterial=新的三个shaderMaterial{ 制服:制服, 顶点着色器:vs, 碎片着色器:fs, }; const geometry=新的3.5倍几何体; 常数numCircles=20; 常数NUMEDGEPOINTSPERCELL=36; 常量numpointspercle=numedgepointspercle*3; const totalPoints=numpointspercille*numCircles; const positions=新Float32ArraytotalPoints*3; 常量法线=新Float32ArraytotalPoints*3; 常数半径=10; 送经=0; 对于设c=0;c因为您已经标记了three.js,所以这是一篇纯three.js视角的评论。是否因为多个网格会降低性能而使用单个缓冲区?你考虑过使用实例吗?是的,使用circlebuffergeometry可以很快降低帧速率~100-250个网格。我没有考虑过使用它,但我对它也不熟悉。拥有~3000-5000个实例并保持60fps听起来合理吗?对circleBufferGeometry注释的后续问题:您是在使用几何体对象,还是在为每个网格创建新的circleBufferGeometry?我无法推测通过使用实例,您将看到什么样的性能提升。您将失去一次绘制调用一个网格的效率,但获得多个网格的易用性。这似乎不起作用。它们现在几乎不知不觉地在扩展。查看您编辑的帖子,建议保留对圆中心的引用。你认为我应该试一试吗?除非你的法线不好,只需添加法线就可以了。增加你的规模。你的圆圈有多大?法线通常是单位向量,因此比例为1将增加1个单位。如果你的圆有1个单位大,那么它们的大小会加倍。如果你的圆有100个单位大,那么如果比例为1,它们只会增长到101。使用其他解决方案与将特定圆的所有位置设置为中心点(着色器)完全相同
会保持不变。如果你保持法线,你基本上会得到相同的结果。只是为了让它更混乱,你可以使用实例化,这样你就不必重复每个圆的每个点的中心点。