Graphics Three.js对象网格

Graphics Three.js对象网格,graphics,three.js,Graphics,Three.js,我想用Three.js绘制一个网格,在给定对象中心和大小的情况下: 它根据对象大小动态调整粒度(网格线之间的空间) 栅格线不相对于对象 我已经实现了第一个要求。第二个很难解释,但通过示例可能更容易理解: 在本演示中,您可以看到,如果按“s”,对象的大小会增加,网格也会增加。栅格分割会根据对象大小的数量级而变化 问题2)是栅格的位置相对于对象的位置(它们具有相同的中心)。因此,网格始终与对象完美匹配。 我要做的是打破这种错觉,让它看起来像是存在于世界空间中的网格,从世界原点开始,出现在物体后面。

我想用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你可以用着色器制作一个带标签的网格,虽然不是那么简单,但这是可能的:)你的解决方案非常聪明,然而,在我的(大的)代码库中复制它时遇到了困难,但这是我的问题!谢谢你的回答