如何在 3D 空间中绘制 3D 点(或点精灵)?
在 JMonkey Engine 站点或其他任何地方都没有绘制点的文档。就一个点。然后更新坐标。没有颜色,只是 3D 空间中的一个点。
如何在 3D 空间中绘制 3D 点(或点精灵)?
在 JMonkey Engine 站点或其他任何地方都没有绘制点的文档。就一个点。然后更新坐标。没有颜色,只是 3D 空间中的一个点。
可以使用直接设置其缓冲区(或技术上的缓冲区)的网格创建点(与球体相反);因为点网格不需要索引缓冲区,因为其他更复杂的网格需要。请参阅如何绘制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 中创建点,如下所示
稍后,如果您需要更新缓冲区中的信息,您可以使用:
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();
,但是如果没有它,对象可能会被剔除,因为显卡认为它们在实际可见时不在屏幕上