1

3D 空間で 3D ポイント (またはポイント スプライト) を描画するにはどうすればよいですか?

JMonkey Engine サイトやその他の場所には、点を描画するためのドキュメントはありません。ワンポイントです。次に、座標を更新します。色はなく、3D 空間の点だけです。

4

1 に答える 1

1

ポイント (球ではなく) は、メッシュを使用して直接バッファを設定することで作成できます (または技術的にはバッファです。ポイント メッシュは、他のより複雑なメッシュが必要とするインデックス バッファを必要としないためです。描画方法を参照してください)。 JMonkey Engine ライブラリの直線)。メッシュの作成については、こちらに文書化されています。

メッシュを使用して 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 に答える