我已经开始阅读维基百科上的资料,但我仍然觉得我并不真正了解场景图的工作原理以及它如何为游戏带来好处.
我在Qt上用OpenGL搞砸了.但现在我想拥有复杂的场景.(加载了多个COLLADA/MD2型号).
为此,我正在考虑使用OpenSceneGraph(OSG).是否可以将OSG与Qt集成?如果是这样怎么样?
谢谢.
虽然OpenGL 3.x本身的最新参考文献似乎很少,但OpenGL的实际低级操作相对简单.然而,我在试图甚至概念化如何操纵VBO以呈现动态世界时遇到了严重的麻烦.
显然,旧的直接模式方式是不适用的,但从那里我去哪里?我是否编写了某种场景结构,然后将其转换为一组顶点并将其传输到VBO,我将如何存储翻译数据?如果是这样,那么代码看起来会如何?
基本上真的不确定如何继续.
我正在学习本教程:http://blog.bignerdranch.com/754-scenekit-in-mountain-lion/
我对使用Scene Kit感兴趣,但我的场景可能有数千个球体.要对Scene Kit进行压力测试,我试过这个:
SCNSphere *sphere = [SCNSphere sphereWithRadius:0.5];
for (int i=0; i<10; i++) {
for(int j=0; j<10; j++){
for(int k=0; k<10; k++){
SCNNode *myNode = [SCNNode nodeWithGeometry:sphere];
myNode.position = SCNVector3Make(i,j,k);
[root addChildNode:myNode];
}
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于1000球(10 ^ 3),但是对于1,000,000个球(100 ^ 3)而言失败(也许不足为奇).我不介意不能使用一百万个球体,但我想弄清楚明智的上限是什么(5,000?15,000?)以及如何增加它.
我该怎么做才能缓解这种情况?例如,我已经尝试了sphere.segmentCount = 3,虽然这加快了渲染速度,但它对内存使用没有太大影响,我怀疑这是限制因素.
此外,似乎没有SCNPoint类.我在考虑切换到仅在球体数量太高时显示一个点,但我无法从SceneKit文档中看到如何显示一个简单的点 - 我能看到的最简单的是一个三角形.
任何帮助深表感谢.
编辑: @toyos建议将SCNSphere对象合并到单个SCNGeometry对象中(前提是它们不需要独立动画,但它们不需要),但我找不到一种简单的方法来执行此操作.
SCNGeometry是使用此处[SCNGeometry geometryWithSources:(* NSArray)sources geometryWithElements:(* NSArray) elements]记录的创建的,但我不清楚如何从我的领域创建一个对象.SCNGeometry
例如,对于单个球体,我可以看到使用sphere.geometryElementCount获取元素的数量,然后使用它来填充数组,使用[sphere geometryElementAtIndex:(NSInteger)elementIndex]它可以给我元素,但我不知道如何获得"源"(或者它们甚至是什么)是).获取几何源的方法是[sphere geometrySourcesForSemantic:(NSString*) semantic],但这个语义字符串是什么?(它意味着是"法线"还是"顶点"还是其他的东西?文档非常有用地说语义是"几何源的语义值."而没有说出语义的可能值是什么)
这只是一个单一的球体,这将是毫无意义的(因为SCNSphere它只是一个SCNGeometry无论如何的子类),所以现在我必须添加多个球体.那么在将它们添加到我的SCNGeometry对象时,我是否必须手动转换球体的顶点? …
你会得到一个带有几个和的复杂Scene2D图形.您希望用户选择一些并在最后绘制它们,以便它们看起来集中在任何其他顶部.libgdxGroup'sActor'sActorsActors
我想迭代Stage两次.第一次绘制未选中的Actors,第二次绘制选中的actors.但是,我没有看到任何"好"的方式来强制执行此行为.
我更喜欢干净的选择.我不想仅仅为了这个小小的添加而复制整个方法实现.
什么行不通:
Actor's toFront()方法仅适用于它的兄弟姐妹.Actor's舞台中的位置:这会修改其所具有的变换Actors.想一想的情景:你有Root一个团体gA和一个团体gB.Group gA包含两个图像iA1和iA2.Group gB包含一个图像iB.鉴于Group gA首先被添加到阶段并且图像iA1与iB重叠; 现在你想选择iA1并让它出现在iB上.我不想只调用gA.toFront() ; 这会将整个Group gA放在前面,这意味着iA2也被放到了前面.将iA2放在前面会产生不希望的影响,即将部分图像隐藏在Group gB中

我正在为Java寻找一个可靠的3D场景图API,它具有良好的文档,活跃的社区和允许商业用途的许可.
我排除了com.sun.scenegraph,因为它是GPL(并且看似已经死了),Java3D因为这篇文章和JMonkeyEngine因为这篇文章.有任何想法吗?
我想知道是否有任何3D场景图工具包可用或至少在Android开发中?假设所有现有的Java解决方案都不能在Android平台上运行,我找不到任何东西.
我正在寻找用于构建 GUI 应用程序的 2D 场景图库。它应该很快,使用 Java2D 并与 Swing 兼容(可嵌入 Swing 应用程序并显示 Swing 组件)。对动画的支持是一个加分项。
我正在尝试将文件中的场景加载到Three.js(自定义格式,而不是Three.js支持的格式).该特定格式描述了场景图,其中树中的每个节点具有指定为4×4矩阵的变换.将它推入Three.js的过程看起来像这样:
// Yeah, this is javascript-like psuedocode
function processNodes(srcNode, parentThreeObj) {
for(child in srcNode.children) {
var threeObj = new THREE.Object3D();
// This line is the problem
threeObj.applyMatrix(threeMatrixFromSrcMatrix(child.matrix));
for(mesh in child.meshes) {
var threeMesh = threeMeshFromSrcMesh(mesh);
threeObj.add(threeMesh);
}
parentThreeObj.add(threeObj);
processNodes(child, threeObj); // And recurse!
}
}
Run Code Online (Sandbox Code Playgroud)
或者至少那是我想要的.正如我所指出的那样,这applyMatrix条线路并不像我期望的那样工作.场景的大部分看起来都不错,但是已经旋转的某些元素没有正确对齐(而其他元素则很奇怪).
通过COLLADA加载器(我的工作大致相同),它们似乎将矩阵分解为平移/旋转/缩放并单独应用.我尝试用它代替上面显示的applyMatrix:
var props = threeMatrixFromSrcMatrix(child.matrix).decompose();
threeObj.useQuaternion = true;
threeObj.position = props[ 0 ];
threeObj.quaternion = props[ 1 ];
threeObj.scale = props[ 2 ];
Run Code Online (Sandbox Code Playgroud)
这再一次产生了一个场景,其中大多数元素都在正确的位置,但之前未对齐的网格现在已经转变为遗忘在某处并且根本不再出现.所以最后这并不比applyMatrix上面的更好.
通过几个关于该主题的在线讨论,似乎为变换使用矩阵的推荐方法是将它们直接应用于几何,而不是节点,所以我尝试通过手动构建变换矩阵,如下所示:
function processNodes(srcNode, parentThreeObj, …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenGL编写一个简单的3D引擎.我已经使用以下模式实现了一个简单的场景图:
ISceneNode
IMeshSceneNode
StaticMeshSceneNode
ICameraSceneNode
StaticCameraSceneNode
TrackBallCameraSceneNode
ILightSceneNode
PointLightSceneNode
Run Code Online (Sandbox Code Playgroud)
但我想知道'渲染器'(实现着色器程序的类)是否也可以是场景节点(将渲染代码从MeshSceneNode提取到RenderSceneNode).对我来说,这可能是一个正确的选择,因为如果我必须使用相同的顶点和片段着色器渲染多个网格(例如42个网格),那么绑定和取消绑定着色器程序只需一次而不是42次就非常有用!
那么您如何看待以下架构:
第一个代表我当前的概念(为了简单起见,我不代表'Light'和'Camera'场景节点).

所以,在这里,如果我想渲染我的3个网格物体(使用3个着色器程序使用相同的着色器),我将为每个帧绑定和取消绑定3次我的着色器程序(在每个网格节点的"渲染"方法中).
这是另一个概念:

如上所示,这次我将在渲染节点中为所有子节点绑定一个唯一的着色器程序.所以它可能会更快.
你怎么看待我的想法?