2013-05-31 47 views
1

如何在3D空间中绘制3D点(或点精灵)?Jmonkey引擎3.0绘图点

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

+0

您是否尝试过ImagePainter SDK插件? http://hub.jmonkeyengine.org/forum/topic/image-getpixelsetpixel-imagepainter-editing-jme3-images/page/4/#post-300344 –

+0

谢谢,我没有尝试过,可能更快,但我已经去了opengl :) –

回答

1

可以使用直接设置其缓冲区的网格(或技术上的缓冲区;因为点网格不需要索引缓冲区,因为其他更复杂的网格物体需要可以创建一个点(与球体相对)。 How can I draw a straight line in the JMonkey Engine library)。网格创建记录为here

使用网在三维空间中创建点下面是一个例子:

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内点如下图所示

points in 3d space

如果你以后需要更新您可以在缓冲区中使用以下信息:

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();,但没有它的对象可能会被淘汰,因为显卡认为他们在屏幕上时,他们实际上是可见的

+0

谢谢。这个缓冲区似乎比例子更快。我在使用颗粒工厂,效率很低。我也开始使用缓冲区(几天前),但不是这样我也使用了颜色缓冲区。你知道任何其他类型的缓冲区吗? –

+0

非常好,我认为这一切都取决于你的使用情况,如果你有一堆所有移动的点,这可能是要走的路。另一方面,如果所有点都独立移动,我认为粒子工厂会更好(但我没有数据支持这一点)。目前我主要使用三角形模式的网格来创建自定义的风景;这需要我设置位置缓冲区,索引缓冲区,TexCoord缓冲区,正常缓冲区和颜色缓冲区。我还没有使用任何其他的缓冲区,虽然 –

+0

粒子工厂(或者它是发射器?)正在使用一个单独的算法来计算粒子随机旋转和一些alpha混合和一些其他我不需要的东西,使一些慢200k粒子后。但是你的缓冲方法很容易得到6M粒子。我在使用jocl在多个设备上进行opencl计算的N-body实验中使用它。 –