1

如何在 3D 空间中绘制 3D 点(或点精灵)?

在 JMonkey Engine 站点或其他任何地方都没有绘制点的文档。就一个点。然后更新坐标。没有颜色,只是 3D 空间中的一个点。

4

1 回答 1

1

可以使用直接设置其缓冲区(或技术上的缓冲区)的网格创建点(与球体相反);因为点网格不需要索引缓冲区,因为其他更复杂的网格需要。请参阅如何绘制JMonkey 引擎库中的一条直线)。网格创建记录在这里

下面是使用网格在 3D 空间中创建点的示例:

import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.*;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.*;
import com.jme3.util.BufferUtils;

public class Main extends SimpleApplication {

    public static void main(String[] args) {
        Main app = new Main();
        app.start();
    }

    @Override
    public void simpleInitApp() {

        Vector3f[] lineVerticies=new Vector3f[5];

        lineVerticies[0]=new Vector3f(2,0,0);
        lineVerticies[1]=new Vector3f(-1,0,1);
        lineVerticies[2]=new Vector3f(0,1,1);
        lineVerticies[3]=new Vector3f(1,1,1);
        lineVerticies[4]=new Vector3f(1,4,0);

        plotPoints(lineVerticies,ColorRGBA.White);
    }


    public void plotPoints(Vector3f[] lineVerticies, ColorRGBA pointColor){
        Mesh mesh = new Mesh();
        mesh.setMode(Mesh.Mode.Points);


        mesh.setBuffer(VertexBuffer.Type.Position, 3, BufferUtils.createFloatBuffer(lineVerticies));


        mesh.updateBound();
        mesh.updateCounts();

        Geometry geo=new Geometry("line",mesh);
        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", pointColor);
        geo.setMaterial(mat);



        rootNode.attachChild(geo);
    }


    @Override
    public void simpleUpdate(float tpf) {
        //TODO: add update code
    }

    @Override
    public void simpleRender(RenderManager rm) {
        //TODO: add render code
    }
}

这将在 pointVerticies 中创建点,如下所示

3d 空间中的点

稍后,如果您需要更新缓冲区中的信息,您可以使用:

VertexBuffer posBuffer = mesh.getBuffer(Type.Position);
posBuffer.updateData(BufferUtils.createFloatBuffer(newData));
posBuffer.setUpdateNeeded();
mesh.updateCounts();
mesh.updateBound();

或者(更有效地)您可以将您的几何图形附加到一个节点并移动它(取决于您的用例)。

注意
在其最基本的状态下,顶点缓冲区需要 x1,y1,z1,x2,y2,z2,x3.... 等,其中一个顶点结束与另一个顶点开始之间没有界限。所以下面会在缓冲区中输入 3 个顶点;(1.1,1.2,1.3), (2.1,2.2,2.3) 和 (3.1,3.2,3.3)

m.setBuffer(VertexBuffer.Type.Position, 3, new float[]{1.1,1.2,1.3,2.1,2.2,2.3,3.1,3.2,3.3});

然而,该createFloatBuffer()方法从数组转换Vector3f为这种形式。

还; 它通常可以“逃脱”不调用mesh.updateBound();,但是如果没有它,对象可能会被剔除,因为显卡认为它们在实际可见时不在屏幕上

于 2013-07-14T13:01:21.303 回答