标签: scenegraph

游戏引擎:什么是场景图?

我已经开始阅读维基百科上的资料,但我仍然觉得我并不真正了解场景图的工作原理以及它如何为游戏带来好处.

  • 游戏引擎开发环境中的场景图是什么?
  • 为什么我要为我的2D游戏引擎实现一个?
  • 使用场景图是否可以替代具有线性实体管理器的经典​​实体系统?

c++ graph scenegraph

31
推荐指数
2
解决办法
2万
查看次数

将OpenSceneGraph与Qt集成

我在Qt上用OpenGL搞砸了.但现在我想拥有复杂的场景.(加载了多个COLLADA/MD2型号).

为此,我正在考虑使用OpenSceneGraph(OSG).是否可以将OSG与Qt集成?如果是这样怎么样?

谢谢.

opengl qt openscenegraph scenegraph

15
推荐指数
2
解决办法
8209
查看次数

如何使用OpenGL 3.x VBO渲染动态世界?

虽然OpenGL 3.x本身的最新参考文献似乎很少,但OpenGL的实际低级操作相对简单.然而,我在试图甚至概念化如何操纵VBO以呈现动态世界时遇到了严重的麻烦.

显然,旧的直接模式方式是不适用的,但从那里我去哪里?我是否编写了某种场景结构,然后将其转换为一组顶点并将其传输到VBO,我将如何存储翻译数据?如果是这样,那么代码看起来会如何?

基本上真的不确定如何继续.

c opengl 2d vbo scenegraph

9
推荐指数
3
解决办法
6550
查看次数

OS X上的SceneKit包含数千个对象

我正在学习本教程: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对象时,我是否必须手动转换球体的顶点? …

cocoa objective-c scenegraph scenekit

8
推荐指数
1
解决办法
5101
查看次数

覆盖绘制顺序scene2D的阶段

你会得到一个带有几个和的复杂Scene2D图形.您希望用户选择一些并在最后绘制它们,以便它们看起来集中在任何其他顶部.libgdxGroup'sActor'sActorsActors

我想迭代Stage两次.第一次绘制未选中的Actors,第二次绘制选中的actors.但是,我没有看到任何"好"的方式来强制执行此行为.

我更喜欢干净的选择.我不想仅仅为了这个小小的添加而复制整个方法实现.

什么行不通:

  • Actor's toFront()方法仅适用于它的兄弟姐妹.
  • 交换Actor's舞台中的位置:这会修改其所具有的变换Actors.

想一想的情景:你有Root一个团体gA和一个团体gB.Group gA包含两个图像iA1iA2.Group gB包含一个图像iB.鉴于Group gA首先被添加到阶段并且图像iA1iB重叠; 现在你想选择iA1并让它出现在iB上.我不想只调用gA.toFront() ; 这会将整个Group gA放在前面,这意味着iA2也被放到了前面.将iA2放在前面会产生不希望的影响,即将部分图像隐藏在Group gB中

在此输入图像描述

java scenegraph libgdx scene2d

8
推荐指数
1
解决办法
2961
查看次数

Java的3D场景图库?

我正在为Java寻找一个可靠的3D场景图API,它具有良好的文档,活跃的社区和允许商业用途的许可.

我排除了com.sun.scenegraph,因为它是GPL(并且看似已经死了),Java3D因为这篇文章和JMonkeyEngine因为这篇文章.有任何想法吗?

java 3d scenegraph

7
推荐指数
1
解决办法
5608
查看次数

适用于Android的3D场景图工具包

我想知道是否有任何3D场景图工具包可用或至少在Android开发中?假设所有现有的Java解决方案都不能在Android平台上运行,我找不到任何东西.

android scenegraph

6
推荐指数
1
解决办法
3949
查看次数

用于 GUI 的 Java 2D 场景图形库

我正在寻找用于构建 GUI 应用程序的 2D 场景图库。它应该很快,使用 Java2D 并与 Swing 兼容(可嵌入 Swing 应用程序并显示 Swing 组件)。对动画的支持是一个加分项。

  • 你对一些图书馆有什么经验吗?
  • 有没有我错过的图书馆?
  • 我必须补充一点,我并没有完全被 Scala 库冒犯。

项目场景图

  • 似乎相当快
  • 仅 GPL(无 LGPL)
  • 支持动画
  • 被遗弃 2年前
  • 作为 JavaFX 的前一部分,它是 Sun 的产品

G

  • 不知道快不快
  • LGPL
  • 没有动画
  • 最新版本 12 月 9 日

短笛2D

  • 对于“可缩放的用户界面”
  • 看起来像一个学术项目
  • 活跃度高的谷歌代码项目
  • BSD 许可证
  • 不知道它是否很快
  • 不知道它是否有动画

纸芯

  • 是一个游戏库
  • 针对小程序部署(使用它作为应用程序是hacky)
  • 非常快
  • 支持动画
  • 2-3年没有发展
  • 可能根本没有 Swing 支持

jTem

  • 更大项目的一部分(乍一看)
  • freeBSD 许可证
  • 没有动画支持
  • 看起来很小

java user-interface scala java-2d scenegraph

5
推荐指数
1
解决办法
3473
查看次数

使用矩阵转换Three.js场景图

我正在尝试将文件中的场景加载到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)

scenegraph webgl three.js

5
推荐指数
2
解决办法
7762
查看次数

关于场景图构思的简单好奇心

我正在使用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次我的着色器程序(在每个网格节点的"渲染"方法中).

这是另一个概念:

在此输入图像描述

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

你怎么看待我的想法?

opengl openscenegraph scenegraph

5
推荐指数
1
解决办法
684
查看次数