Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx ScalaFX:如何在透视图中旋转耦合两个图形_Javafx_Scalafx_Javafx 3d - Fatal编程技术网

Javafx ScalaFX:如何在透视图中旋转耦合两个图形

Javafx ScalaFX:如何在透视图中旋转耦合两个图形,javafx,scalafx,javafx-3d,Javafx,Scalafx,Javafx 3d,一个基本的旋转问题-如何耦合两个图形(一个长方体/立方体,其中一个球体位于立方体的任何位置,但位于中心),以便这两个图形在透视图中旋转耦合(这就是为什么我不希望球体位于立方体的中心) 换句话说,当我用鼠标旋转立方体并使球体更靠近前面(例如,旋转180度)时,透视图会相应地改变,球体在视觉上变得更大(与后面的位置相比) 问了几位ScalaFX专家——他们都说这是一个非常好的问题,并建议在这里发布 干杯: 扎尔 >我不完全确定您想做什么,但是您可以通过对包含所有这些对象的组应用rotate变换来旋转

一个基本的旋转问题-如何耦合两个图形(一个长方体/立方体,其中一个球体位于立方体的任何位置,但位于中心),以便这两个图形在透视图中旋转耦合(这就是为什么我不希望球体位于立方体的中心)

换句话说,当我用鼠标旋转立方体并使球体更靠近前面(例如,旋转180度)时,透视图会相应地改变,球体在视觉上变得更大(与后面的位置相比)

问了几位ScalaFX专家——他们都说这是一个非常好的问题,并建议在这里发布

干杯:

扎尔


>

我不完全确定您想做什么,但是您可以通过对包含所有这些对象的
组应用
rotate
变换来旋转多个对象。如果只希望旋转部分对象,而不是全部对象,则必须构造场景,以便旋转的对象有一个公共父对象组
,而非旋转对象都不属于该组。将
Rotate
变换应用于父
也将旋转其所有子对象。旋转将围绕父
组的原点进行

更新:我忘了提到如何解决透视问题。场景中的3D对象不会直接受到透视的影响,因为透视是场景渲染方式的属性。此渲染由
摄影机
对象执行。要使用透视渲染场景(与JavaFX/ScalaFX中提到的使用正交或平行相反),请在场景中添加一个
PerspectiveCamera
,并使用该相机查看场景。有关这方面的更多信息,请参阅以下内容:

更新2:我已经创建了一个完整的程序来执行此操作

更新3:使长方体透明并在长方体内移动球体。现在,鼠标左键/主键在拖动时旋转长方体+球体;鼠标右键/次键将摄影机推拉移向/移离长方体,相应地更改透视

更新4:因此,如果我理解正确,您希望变换3D场景中的形状,使其看起来像已应用透视图一样。我有这个权利吗

如果是,这不是“内置”功能的原因如下所述。请原谅我,如果你已经知道所有这些,顺便说一句-我只是想提供一个全面的答案。:-)

  • (通常由3D系统(如JavaFX)使用)以层次树结构捕获3D场景的几何体、位置、旋转、颜色等。其思想是建模者只需要关心场景的内容——确保尺寸、对齐等是正确的——而不需要关心场景的渲染方式
  • 当场景与从特定视点显示的场景相同时,可以应用透视;i、 e.将场景转换为二维投影(如GUI窗口)时。(确定场景在透视图中的外观的过程是渲染算法的一部分,但不需要对场景进行修改、变形等。)如果未启用透视,则通常以正交方式渲染场景,没有任何消失点、明显的缩放,这里的关键点是场景本身不受观看方式的影响
  • 通过这种安排,可以在同一场景中有多个视图。它们不仅可以各自拥有不同的视点,而且有些可以是正交的,有些可以使用透视,但它们都可以正确渲染场景,而不会产生任何令人困惑的瑕疵。如果它按照您似乎认为的方式工作,那么您一次只能看到场景的一个视图,因为场景在渲染过程中需要变形,才能从该唯一视点观看。编辑场景时,需要删除这些变形,以防止建模者产生令人兴奋的混乱
简言之,这是一个非常不寻常的要求,场景本身被变形,以显示它在透视图中的样子。这就是为什么在我所知道的任何3D系统中都没有内置的功能来实现这一点

假设您希望继续使用JavaFX,请记住以下几点:

  • 我不相信常规的3D原语(即
    长方体
    球体
    &
    圆柱体
    )可以变形来表示它们的透视图。您必须使用
    三角形网格
    网格视图
    对象构建形状(前者捕获形状的几何图形,后者允许将其视为三维形状)
  • 若要应用透视,必须重新定位
    三角形网格
    实例中的顶点,以适当地变形场景。如果需要能够更改视点或旋转长方体和球体,则这些更改需要是动态的,以便计算的顶点坐标对更改的视点和/或旋转作出反应。由于高水平透视扩张下的鱼眼效果,您可能需要比预期更多的顶点
  • 根据您的要求,您仍然需要一个摄影机来查看场景。显然,您不能使用透视摄影机来渲染场景,否则它会将场景视为未调整,并应用第二级透视,从而破坏精心计算的变形。然后,需要使用
    ParallelCamera
    生成场景的正交视图
  • 不幸的是,JavaFX对3D场景使用
    ParallelCamera
    的支持还很不成熟。(平行摄影机主要用于渲染2D场景,例如对话框、按钮、菜单、幻灯片