【问题标题】:Unfolding Cube in SceneKit在 SceneKit 中展开立方体
【发布时间】:2020-09-29 06:11:36
【问题描述】:

我正在尝试制作一个简单的应用程序,它显示一个立方体展开成一个 6 面平面,面向内和向外打开。这是video

这可以在 SceneKit 框架中完成吗,我被告知无法完成,但必须在 3D 软件中完成,导出为 fbx 文件,然后导入 Unity。我不是应用程序开发人员,所以只是想确定一下。谢谢。

【问题讨论】:

  • 你试过用四边形(GameObject -> 3d -> Object -> Quad)制作你的立方体,

标签: swift unity3d scenekit maya


【解决方案1】:

您是否尝试过用四边形(GameObject -> 3d -> Object -> Quad)制作立方体。然后,您可以将每个四边形作为一个空游戏对象的父对象,该游戏对象定位到您希望立方体面旋转的位置。然后将所有这些游戏对象作为“Cube”父级的子级。然后,您可以简单地使用 Unity 的内置动画器围绕其枢轴旋转每个面。

【讨论】:

    【解决方案2】:

    如果问题归结为“是不是单靠代码无法实现,必须使用3D工具?”那么答案是否定的。

    无需任何 3D 资产即可以编程方式完成此效果。

    【讨论】:

      【解决方案3】:

      您不仅可以在 Autodesk Maya 中展开或分解多边形立方体(然后将其导出为 fbxusdz),还可以在 SceneKit 或 Unity 中使用 6 个方形平面来完成。重要的是,您需要将每个方形平面的 pivot point 定位在其边缘(默认情况下,pivot point 居中)。然后,您需要为每个平面设置 90 度旋转的动画。

      这是一个关于如何使用 SceneKit 模块的 Swift 代码:

      import SceneKit
      
      class ViewController: UIViewController {
      
         @IBOutlet var sceneView: SCNView!
          
          override func viewDidLoad() {
              super.viewDidLoad()
      
              sceneView.autoenablesDefaultLighting = true
              
              let scene = SCNScene()
              sceneView.scene = scene
              sceneView.allowsCameraControl = true
              sceneView.backgroundColor = UIColor.black
              
              // FIRST SIDE OF CUBE
              let planeNode_01 = SCNNode()
              planeNode_01.geometry = SCNPlane(width: 1.0, height: 1.0)
              planeNode_01.geometry?.firstMaterial?.isDoubleSided = true
              planeNode_01.geometry?.firstMaterial?.lightingModel = .lambert
              planeNode_01.geometry?.firstMaterial?.diffuse.contents = UIColor.red
              planeNode_01.position.z = -0.5
      
              planeNode_01.simdPivot.columns.3.y = -0.5      // shifts pivot point
              planeNode_01.eulerAngles.x = CGFloat.pi / 4    // in radians
              scene.rootNode.addChildNode(planeNode_01)
              
              // SECOND SIDE OF CUBE
              let planeNode_02 = SCNNode()
              planeNode_02.geometry = SCNPlane(width: 1.0, height: 1.0)
              planeNode_02.geometry?.firstMaterial?.isDoubleSided = true
              planeNode_02.geometry?.firstMaterial?.lightingModel = .lambert
              planeNode_02.geometry?.firstMaterial?.diffuse.contents = UIColor.green
      
              planeNode_01.simdPivot.columns.3.y = -0.5       // shifts pivot point
              planeNode_02.eulerAngles.x = CGFloat.pi / 2     // in radians
              scene.rootNode.addChildNode(planeNode_02)
      
              // THIRD SIDE OF CUBE
              // ...
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-12-21
        • 2014-10-06
        • 2016-07-03
        • 2015-04-07
        • 1970-01-01
        • 2012-01-22
        • 2014-08-12
        • 1970-01-01
        • 2017-04-21
        相关资源
        最近更新 更多