问题标签 [scenegraph]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
optimization - 场景图:递归还是迭代?
我和一位同事正在讨论在复杂游戏中通常如何渲染场景。他相信世界是以最真实的面向对象的方式递归渲染的,世界上的许多演员都覆盖了像 Actor.Draw() 这样的虚拟函数(例如 Koopa.Draw()、Goomba.Draw())。
相比之下,我想象今天的复杂游戏会迭代他们的场景图,避免虚拟函数开销,并为专门的迭代器提供更大的灵活性(例如,近到远与远到近,跳过树中的某些对象等.) 我在 OpenGL 和 DirectX 方面的经验告诉我,他们倾向于批量绘制对象,并通过递归调用(即类的 Draw() 函数将绘制到的批处理)传递批处理上下文似乎是额外的参数 -传递可以通过迭代避免的开销。
如今,一种方法比另一种更受欢迎吗?如果是这样,为什么?
3d - modify java3d SceneGraph dynamically
I recently started working on java3D. Currently I am working on a java3D racing game. I just wanted to know is it possible to add objects (i.e. scenegraph nodes nodes) e.g. spehere, box, etc. to a scene graph which has been compiled.
If i want to add an object onto a graph on a keyPress event, or on a timing event how can it be done?
c++ - 旋转 4x4 矩阵会导致随时间缩放
我正在使用glm::rotate
旋转场景中立方体的变换矩阵。
"cube->t = glm::rotate(cube->t, stepTime * 50.f, glm::vec3(0.f, 1.f, 0.f));"
每帧调用一次,cube->t
所讨论的矩阵在哪里。
奇怪的是,在 20 分钟的过程中(或者如果我旋转stepTime * 5000.f
而不是2 分钟stepTime * 50.f
),立方体在 X 和 Z 轴上明显缩放,这两个轴上的缩放在任何时候都是相同的(高度立方体的大小从不改变,但宽度和深度的变化量完全相同)。在 的情况下5000.f
, 变小, 和正常的50.f
or 100.f
, 变大。
我认为这可能是舍入错误的问题,但除此之外我不知道是什么原因造成的。这是舍入错误吗?我可以通过定期标准化矩阵来解决它吗?glm 是否具有标准化矩阵的功能,还是我必须自己编写一个?
c++ - Openscenegraph - 如何创建一个相机无法超越的不可见边界
我是 3d 编程的新手,所以就到这里。我正在尝试模拟一个房间。我没有加载墙壁的图像,但我想在代码中模拟边界。请问我该怎么做?
下面是处理相机移动的代码
webgl - 使用矩阵变换 Three.js 场景图
我正在尝试将文件中的场景加载到 Three.js(自定义格式,不是 Three.js 支持的格式)。这种特定格式描述了一个场景图,其中树中的每个节点都有一个指定为 4x4 矩阵的变换。将其推入 Three.js 的过程如下所示:
或者至少这就是我想要的。正如我所指出的,这applyMatrix
条线并不像我期望的那样工作。大部分场景看起来不错,但某些已旋转的元素没有正确对齐(而其他元素则很奇怪)。
通过 COLLADA 加载器(它与我正在尝试做的事情大致相同)看起来他们将矩阵分解为平移/旋转/缩放并单独应用每个。我尝试用它代替上面显示的 applyMatrix:
这再一次产生了一个场景,其中大多数元素都在正确的位置,但以前未对齐的网格现在已经在某个地方变成了遗忘,根本不再出现。所以最后这并不比applyMatrix
上面的好。
查看有关该主题的几个在线讨论,似乎推荐的使用矩阵进行变换的方法是将它们直接应用于几何,而不是节点,所以我尝试通过手动构建变换矩阵,如下所示:
这实际上产生了正确的结果!(减去法线的一些怪癖,但我可以弄清楚)这很好,但问题是我们现在已经有效地扁平化了场景层次结构:更改父级的变换将对子级产生意想不到的结果,因为完整的变换堆栈现在“烘焙”到网格中。在这种情况下,关于场景的信息丢失是不可接受的。
那么如何告诉 Three.js 执行相同的逻辑,但在场景图中的适当位置?
(抱歉,我非常想发布一些实时代码示例,但不幸的是,在这种情况下,这不是一个选项。)
java-3d - java3d 拾取对象
我正在构建一个 java3d GUI,用户可以使用它创建自定义场景图,而无需知道代码,我想使用鼠标选择特定的框,并且我希望能够移动它们......所以我需要选择..
我的场景图中有 2 个盒子和 2 个球体。我只想选择其中一个,并知道选择了哪一个。我可以找出单击了哪种类型的对象,例如,如果我单击特定的球体或框,我可以找到它,但是我不知道如何找出它是哪个对象,因此我可以对其进行处理。
谁能建议我解决这个问题?我只想知道选择了哪个对象。就这样。
c++ - 对象渲染顺序,场景图?
我正在使用 OpenGL 渲染 3D 对象。3D 世界中的每个对象都有一个边界框和一个关联的模型矩阵,用于将对象从零件坐标系 (PCS) 转换为世界 (WCS)。边界框也在 PCS 中。每个对象的质心在 WCS 中计算并与每个对象相关联。
给定 WCS 中的相机位置和目标位置:-> 我想从前到后渲染所有不透明对象(alpha == 1)。-> 我想在渲染不透明对象后从后到前渲染所有半透明对象。
由于这是我第一次尝试实现图形引擎,我不确定场景图将如何帮助我。我想我必须根据与相机的距离手动对对象进行排序,然后根据不透明/半透明对象进行渲染。我真的需要场景图吗?我应该如何实施引擎。我可以使用其他可用的引擎,但我不喜欢并且想自己实现。
android - 画布操作与元素操作
我正在开发一个小型库作为某些应用程序的基础。当我即将创建一个场景图(2D)时,我想知道从性能、可维护性、易用性等角度来看,以下哪种方法看起来更有前途。
- 我可以给每个可绘制元素一个矩阵,我可以在其中执行平移、旋转等操作。
- 我可以在画布上而不是元素上做所有事情。
第一个解决方案有一个缺点:对于像圆这样的原始元素,我无法在绘图调用中传递矩阵,我必须像这样访问矩阵中的翻译值:
因此,在每次绘制调用中,我为每个 getter 调用创建一个浮点数组(一个用于 getX(),一个用于 getY())。假设我在屏幕上有很多元素,这可能会导致内存和性能影响。
第二种方法有“消极”思维的缺点。如果我想在点 100/100 绘制一个元素,我必须将画布转换为 -100/-100,就像在 0/0 上绘制一样。如果我在那之后恢复画布,结果将是元素被绘制在想要的 100/100 上。我不确定这种消极的想法是否会对代码的可维护性和理解度造成严重影响(甚至从未开始考虑通过简单地忘记否定某些东西来引入错误......)。
有人有提示应该首选哪种方式?
c++ - 如何遍历类似场景图的树结构?
我有一个场景图:
所以在Transform方法中我想变换节点的坐标和它所有子节点的坐标,所以我必须首先用GetChildTransformStream获取所有子节点的列表,但我不知道如何遍历它,因为它可以有任意数量的子节点,它们可以有任意数量的子节点等等。你通常如何处理这个?
javafx - javafx scene.lookup
我正在将现有的 Swing 应用程序转换为 JavaFX。我认为这段代码会返回一个名为“#paneRightBottom”的节点,但它返回 null。使用 netbeans 调试器,我可以深入“topNode”并找到“#paneRightBottom”节点六层深,所以它就在那里。我已经阅读了在线文档,并认为我应该得到一个节点。有谁知道我哪里出错了?