3D 空間で 3D ポイント (またはポイント スプライト) を描画するにはどうすればよいですか?
JMonkey Engine サイトやその他の場所には、点を描画するためのドキュメントはありません。ワンポイントです。次に、座標を更新します。色はなく、3D 空間の点だけです。
3D 空間で 3D ポイント (またはポイント スプライト) を描画するにはどうすればよいですか?
JMonkey Engine サイトやその他の場所には、点を描画するためのドキュメントはありません。ワンポイントです。次に、座標を更新します。色はなく、3D 空間の点だけです。
ポイント (球ではなく) は、メッシュを使用して直接バッファを設定することで作成できます (または技術的にはバッファです。ポイント メッシュは、他のより複雑なメッシュが必要とするインデックス バッファを必要としないためです。描画方法を参照してください)。 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 内にポイントが作成されます
後でバッファ内の情報を更新する必要がある場合は、次を使用して実行できます。
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();
、オブジェクトが実際に表示されているときにグラフィックカードが画面外にあると見なされるため、オブジェクトがカリングされる可能性があります