Graphics Three.js对象网格
我想用Three.js绘制一个网格,在给定对象中心和大小的情况下:Graphics Three.js对象网格,graphics,three.js,Graphics,Three.js,我想用Three.js绘制一个网格,在给定对象中心和大小的情况下: 它根据对象大小动态调整粒度(网格线之间的空间) 栅格线不相对于对象 我已经实现了第一个要求。第二个很难解释,但通过示例可能更容易理解: 在本演示中,您可以看到,如果按“s”,对象的大小会增加,网格也会增加。栅格分割会根据对象大小的数量级而变化 问题2)是栅格的位置相对于对象的位置(它们具有相同的中心)。因此,网格始终与对象完美匹配。 我要做的是打破这种错觉,让它看起来像是存在于世界空间中的网格,从世界原点开始,出现在物体后面。
我要做的是打破这种错觉,让它看起来像是存在于世界空间中的网格,从世界原点开始,出现在物体后面。
最简单的方法是开发一个网格,其大小可以从原点开始包含对象。但是,由于场景和摄影机将是静态的(本例中不是这种情况),我需要一个足以容纳对象的网格(不需要从原点开始,因为对象可能离原点很远),并且分割数(网格线之间的粒度)仍随其大小而变化 我知道第一个问题的当前解决方案可能与第二个问题相冲突,因此我正在寻找想法,甚至是现有的解决方案(如果有的话) 注意:可以假定对象始终是四边形。单击“c”也可以更改对象的中心 主代码位于
网格中
类:
let divisions=getDivisions(大小);
让步长=大小/分段;
设半尺寸=尺寸/2;
设顶点=[];
for(设i=0,k=-halfSize+step;i
一个选项是:
let box = new THREE.Box3().setFromObject( theObject );
let sz = box.getSize(new THREE.Vector3())
let root = new THREE.Object3D();
let maxSz = Math.max(Math.max(sz.x,sz.y),sz.z)
root.scale.multiplyScalar( 1.0 / maxSz )
root.add( theObject )
scene.add(root);
现在,将始终缩放对象,使其最大轴大小为1
setFromObject确实很有用,但它可能会有一些成本,这取决于THREE需要做多少工作才能确定对象的最终大小。所以,也许应该避免经常打电话。object.localToWorld和.worldToLocal也非常有用。。仅供参考
仅供参考。。有一些很酷的方法来制作栅格着色器。您可以使用着色器来实现此目的 相关论坛主题:
var scene=new THREE.scene();
var摄像机=新的三透视摄像机(60,内宽/内高,11000);
摄像机位置设置(0,0,10);
var renderer=new THREE.WebGLRenderer();
渲染器.setClearColor(0x888888);
设置大小(innerWidth,innerHeight);
document.body.appendChild(renderer.doElement);
var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
var geom=new THREE.PlaneBufferGeometry();
var mat=新的3.ShaderMaterial({
顶点着色器:`
可变vec4 VPO;
void main(){
vPos=模型矩阵*vec4(位置,1.0);
gl_位置=投影矩阵*视图矩阵*vPos;
}
`,
碎片着色器:`
//http://madebyevan.com/shaders/grid/
#扩展GL_OES_标准_衍生工具:启用
可变vec4 VPO;
void main(){
vec2坐标=vPos.xy;
vec2网格=绝对值(分形(坐标-0.5)-0.5)/fwidth(坐标);
浮动线=最小值(网格x,网格y);
gl_FragColor=vec4(vec3(1.0-min(线,1.0)),1.0);
}
`
});
var平面=新的三个网格(geom、mat);
场景。添加(平面);
var clock=新的三个时钟();
renderer.setAnimationLoop(()=>{
设t=clock.getElapsedTime();
设标度=5+(数学sin(t)*0.5+0.5)*2;
平面.scale.set(比例,比例,1);
plane.position.set(
数学cos(t),
数学sin(t),
0
);
渲染器。渲染(场景、摄影机);
});代码>
正文{
溢出:隐藏;
保证金:0;
}
使用着色器是一种有趣的方法,但我担心这会使添加轴的数量变得非常困难,至少以我使用framework@DanielMarques你可以用着色器制作一个带标签的网格,虽然不是那么简单,但这是可能的:)你的解决方案非常聪明,然而,在我的(大的)代码库中复制它时遇到了困难,但这是我的问题!谢谢你的回答