- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在使用 JMonkey Engine 3D 图形库指定的 3D 顶点之间绘制直线。 JMonkey 当然针对导入模型进行了优化,但我知道它也可以用于“内部”创建自定义形状。
例如,如果我要尝试在以下之间绘制:
(2,0,0)
(-1,0,1)
(0,1,1)
(1,1,1)
(1,4,0)
然后我会得到:
最佳答案
更新
在最新版本的 Jmonkey 中 Line
类的存在使这个过程简单得多。这个详细here .
原始答案
JMonkey 中的线是使用自定义网格创建的,您将顶点作为 float 的位置缓冲区,将索引(顶点连接到哪个)作为短裤缓冲区。这个答案松散地基于 a forum thread on mesh buffers和 the JMonkey advanced graphics wiki page
示例程序如下
import com.jme3.app.SimpleApplication;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Node;
import com.jme3.scene.VertexBuffer;
import com.jme3.scene.shape.Box;
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);
plotLine(lineVerticies,ColorRGBA.Blue);
}
public void plotLine(Vector3f[] lineVerticies, ColorRGBA lineColor){
Mesh m = new Mesh();
m.setMode(Mesh.Mode.Lines);
m.setBuffer(VertexBuffer.Type.Position, 3, BufferUtils.createFloatBuffer(lineVerticies));
short[] indexes=new short[2*lineVerticies.length]; //Indexes are in pairs, from a vertex and to a vertex
for(short i=0;i<lineVerticies.length-1;i++){
indexes[2*i]=i;
indexes[2*i+1]=(short)(i+1);
}
m.setBuffer(VertexBuffer.Type.Index, 2, indexes);
m.updateBound();
m.updateCounts();
Geometry geo=new Geometry("line",m);
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", lineColor);
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
}
}
在这个程序中,网格类型设置为
m.setMode(Mesh.Mode.Lines);
这表明网格将期望索引对指示哪些顶点连接到哪些(其他常用选项包括 m.setMode(Mesh.Mode.Triangles);
在这种情况下它会期望三个索引的集合指示哪些顶点组成三角形)。
在其最基本的状态下,顶点缓冲区需要 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});
然后索引缓冲区将连接 0-->1 1-->2
m.setBuffer(VertexBuffer.Type.Index, 2, new short[]{0, 1, 1, 2});
请注意,每个缓冲区的第二个参数表示有多少条目对应于单个“操作”,例如顶点是 3D,所以参数是 3,索引是从-->到成对的,所以参数是 2 .
然而,有一些实用方法可以使它更易于使用,而不是输入 x1、y1、z1、x2、y2、z2、x3 ... BufferUtils.createFloatBuffer()
方法允许您改用 Vector3f
数组,因此
m.setBuffer(VertexBuffer.Type.Position, 3, BufferUtils.createFloatBuffer(lineVerticies));
其中 lineVerticies
的类型为 Vector3f[]
。但值得注意的是,这样做会影响性能,如果您可以直接创建 float[],它将避免不必要的转换(对于大型网格尤其重要)。
m.updateBound();
和 m.updateCounts();
似乎对于确保绘制线条不是必需的;然而,如果没有它们,线条可能会被错误地剔除(当它仍在屏幕上时,显卡可以认为它不是并且“不费心”渲染它)
关于java - 如何在 JMonkey 引擎库中画一条直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17424781/
我想以 headless 模式(屏幕上根本没有 GUI)将 JPanel 绘制到 BufferedImage 中。 final JPanel panel = createPanel(); panel.
我是 Canvas 的新手,正在尝试创建看起来逼真的 float 粒子动画。 目前,我正在创建 400 个随机散布在 400x400 Canvas 上的粒子。 然后,在每个 requestAnimat
有没有办法在悬停时停止悬 float 画? :hover 这是一个显示动画的链接: https://codepen.io/youbiteme/pen/RprPrN 最佳答案 只需为您的 svg 悬停添
我想在谷歌地图上绘制覆盖图,其中除了特定点周围 1.5 公里半径以外的所有内容都被遮蔽了。为此,我尝试使用带有大量边框的圆圈,所以我会在边框中放置透明中心和覆盖颜色来实现这一点,但它无法渲染。
我正在尝试通过扩展类 UIView 来创建自定义 View ,该类可以在自定义 View 的中心显示一个圆圈。为了添加自定义绘图,我重写了 draw(_ rect: CGRect) 方法,如下所示。
我是一名优秀的程序员,十分优秀!