编辑:为了进行实时绘图,在opengl和opencl之间的"互操作性"中开始使用ljjgl(jmonkeyengine和jocl的基础),现在可以实时计算和绘制100k粒子.也许mantle版本的jmonkey引擎可以解决这个drawcall开销问题.
几天来,我一直在学习Eclipse(java 64位)中的jMonkey引擎(版本:3.0)并尝试使用GeometryBatchFactory.optimize(rootNode);命令优化场景.
没有优化(具有改变球体位置的能力):

好的,只有1-fps来自pci-express带宽+ jvm开销.
通过优化(无法改变球体位置):

现在即使三角形数量增加也是29 fps.
Java3D有一种setCapability()方法,即使在优化的形式下也能够读/写场景对象.jMonkey引擎3.0必须能够满足这个主题,但我找不到它的任何痕迹(搜索过的教程和示例,失败了).
问题:如何在jMonkey 3.0中设置场景节点的read/write position/rotation/scale功能optimized?如果你不能回答第一个问题,你能告诉我为什么在使用优化命令时三角数会增加吗?我是否必须创建一种新方法来访问图形卡并自己更改变量(可能是jogl?)?
场景信息:16k粒子(16x16 res的球体)+ 1点光源(以及4096分辨率的阴影).
我确信我们可以通过pci-express轻松地在几毫秒内发送数千个浮点数.
对于batchNode.batch();优化的情况,这里再次使用减少的对象数1 fps:

对象编号现在只有几百个,但fps仍然是1!
将球体位置发送到gpu并让它计算顶点位置可能比计算cpu上的顶点以及向gpu发送大量数据更好.
这里没有人帮忙吗?已经尝试过batchNode但没有帮助.
我不想改变3d api,因为jMonkey人已经重新发明了轮子,我对目前的情况很满意.只是试图挤出更多的性能(取消阴影给出100%的速度,但质量也很重要!).
这个java程序将成为一个小行星撞击场景模拟器(将有小行星大小,质量,速度,角度的选择)与带有LOD的行进立方体算法(将是数百万个粒子).
Marching-cubes算法会大大减少三角形数.如果你无法回答这个问题,那么任何行进立方体(或任何O(n)凸包)算法都将被接受!数据:作为源的x,y,z数组和作为目标的三角形条形阵列(等面网格点)
谢谢.
以下是有关流的一些示例(分辨率低得多):
1)通过引力折叠立方体形状的岩石组:

2)排斥力开始显现:

3)排斥力+引力使得组形成更平滑的形状:

4)组形成一个球体(如预期的那样):

5)然后,一个大的恒星身体接近:

6)即将触摸:

7)影响的时刻:

借助Barnes-Hutt算法和截断电位,粒子数将增加10倍(可能超过100倍).
不是Marching-Cubes算法,包裹nbody的鬼布可以给出低分辨率的船体(比BH更容易但需要更多的计算)
鬼布会受到nbody(重力+排除)的影响,但是不会受到包裹它的布的影响.Nbody不会被渲染,但布料网格将以较低的triange数量渲染.

如果MC或以上工作,这将使程序渲染一个包裹布,大约200倍的粒子.
我的同事正在使用Java3D来可视化有限元模拟的结果.问题是Java3D似乎已经死了,这对OSX来说是一种痛苦.这是我们寻找替代品的原因之一.我们当前基于Java3D的实现已经做了很多工作,所以问题是离开Java3D需要付出多少努力.JOGL是一个选项,但看起来很多工作.
有没有关于替代品的建议?有这种迁移的经验吗?
是否可以在Nvidia 3D Vision硬件上运行Java3D应用程序?
我有一个可以在立体3D中运行的现有Java3D应用程序.在过去,我总是使用OpenGL渲染器和四缓冲立体声在Quadro卡上运行应用程序.
我现在可以使用nVidia 3D Vision系统(带有GeForce GTX 460M)的笔记本电脑.从文档中可以看出,如果我使用DirectX绑定并让nVidia驱动程序处理立体声,应该可以在立体声中运行我的应用程序,但是,似乎并非如此.
如果我使用j3d.rend = d3d运行Java3D应用程序,则nVidia 3D Vision API似乎不会将其识别为DirectX应用程序.
如何让nVidia 3D Vision驱动程序检测Java3D应用程序并以立体3D渲染?
Java3D启动了几个系统线程,并没有在它们上设置isDaemon标志.当我处置我的应用程序的(仅)JFrame时,它将不会终止,因为这些线程仍在运行.
调用System.exit()似乎是终止应用程序的唯一方法.(当然,或者从外面杀死它).
由于我不喜欢调用System.exit(),我尝试了以下(但没有成功):
我接近放弃并调用System.exit(),但我仍然不喜欢它.你知道更好的方法吗?
UV纹理坐标与ST纹理坐标之间有什么区别?
我知道在OpenGL中使用UV和ST.
我也知道ST也用在Java中.
我遇到了一些麻烦,配置java3D以适应我的IDE环境......
我已经下载了j3d-1_5_2-linux-i586.zip,并解压缩了j3dcore.jar,j3dutils.jar,vecmath.jar,libj3dcore-ogl.so,libj3dcore-ogl-cg.so并将它们全部添加为"Referenced Libraries"我的项目文件夹.这摆脱了我得到的任何编译警告但是当我编译并运行应用程序时,我得到以下异常!
Exception in thread "main" java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231)
at java.security.AccessController.doPrivileged(Native Method)
at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:200)
at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:157)
at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:987)
at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:299)
at Hello3d.<init>(Hello3d.java:10)
at Hello3d.main(Hello3d.java:18)
Run Code Online (Sandbox Code Playgroud)
这里也快速浏览一下源代码.注意:一旦将Eclipse添加为Referenced Libraries,Eclipse就会使用Ctrl + Shift + O自动拉入导入库路径.
import javax.media.j3d.BranchGroup;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class Hello3d {
public Hello3d(){
SimpleUniverse universe = new SimpleUniverse();
BranchGroup group = new BranchGroup();
group.addChild(new ColorCube(0.3));
universe.getViewingPlatform().setNominalViewingTransform();
universe.addBranchGraph(group);
}
public static void main(String[] args){
new Hello3d();
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定我对'j3dcore-ogl'有什么意义但是我坚持这一点.如何在系统环境或IDE项目中安装java3D?请帮忙.
IDE:Eclipse SDK …
假设您的眼睛位于物体A上的表面点P1并且存在目标物体B并且物体B后面存在点光源.
问题:如果我看到光源并说"我在阴影中",如果由于物体B我看不到光线,我是对的吗?然后我将对象A的那个点标记为"A上的B的阴影点之一".

如果这是真的,那么我们可以在A的表面上建立一个"阴影几何"(黑色)对象,然后由于光,B,A等的运动实时地改变它吗?让我们说球体(A)有1000个顶点而其他球体(B)也有1000个顶点,那么这意味着1个百万的比较吗?(是阴影,O(N ^ 2)(时间)复杂性?).我不确定复杂性,因为改变P1(眼睛)也会改变B的观察点(P1和光源点之间).那么二阶阴影和更高的阴影(例如两次物体之间多次反射的光线)?
我现在使用的是java-3D,但它没有阴影功能,所以我想转移到其他兼容java的库.
谢谢.
编辑:我需要在移动相机时禁用"相机"来构建阴影.我怎样才能做到这一点?这会严重降低性能吗?
新思路: java3D具有内置的碰撞检测功能.我将创建从光到目标多边形顶点的线(不可见),然后检查来自另一个对象的碰撞.如果发生冲突,请添加该顶点corrd.到阴影列表,但这只适用于点光源:(.
任何为java3d提供真正的阴影库的人都会非常有帮助.
java3D中非常小的样本Geomlib阴影/光线跟踪可能是最好的 Ray跟踪示例吗?
我知道这有点难,但至少有一百人可以试过.
谢谢.
我将Swing和Java3D结合在一起.应使用Event Dispatcher Thread完成swing组件的操作,而Java3D组件的操作应在BehaviourSchedulerThread中完成.
Java3D渲染场景,然后执行与场景关联的所有行为.
我在Canvas3D上启用了MouseListener.事件将发布到AWT事件队列中.然后我想基于这些事件修改Java3D环境,所以我使用了一个特殊的行为,我可以将Runnable发布到.这确保Runnable在Java3D的行为周期中执行(并且在渲染周期期间不要修改任何内容).
假设行为中的某些操作想要修改Swing模型.然后我必须向EDT发布一个新的Runnable.
这是正确的方法吗?
使用这种技术,我在鼠标监听器上遇到了很多问题.我在行为中更新了Java3D模型中的一个点,同时更新了swing GUI.
更新:问题可以更明确地定义如下:
我有一个JButton"旋转立方体",它有一个ActionListener.一旦触发了ActionListener,它就会将AWTEvent推送到Java3D行为中.一旦行为触发,它会修改场景图,然后修改JButton actionListener和文本以变为"停止旋转".
StopSpinningActionListener.SpinActionListener.实际发生的是以下内容:
AWTEvent被派遣到了SpinActionListener.这将创建一个在J3D行为内执行的Runnable.显然,我不应该依赖于AWTEvent的顺序处理.我不能在EDT中等待触发行为,因为任何SwingUtilities.invokeAndWait()都会导致死锁.
前段时间我读到了Java 3D与Java FX的集成,文章报道了将3D 3D引擎重写为FX的主要Java 3D项目.
有没有办法使用Java API检索我的图形卡适配器的信息?
我知道DirectX可以很容易地做到这一点,但是,我只是想知道Java是否可以做到这一点......?
如下图所示..DirectX发现GPU适配器集成到我的硬件,以及其支持的分辨率列表.
我的问题是,有没有一个API,Java会做这种事情?我真的很想知道Java是否能够获得有关视频卡的信息.

谢谢.