• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 旋转 SCNNode.pivot 后 SceneKit 项目点不正确

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:49:17 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我想从 SCNNode 检索屏幕坐标,以便可以在 SpriteKit-overlay 中使用这些坐标。 该节点是一个子节点。 当我旋转父节点的枢轴 projectPoint 返回乱码结果。

SCN场景:

class ScenekitScene:SCNScene {
    override init() {
        super.init()

        let nodeCamera = SCNNode()
        nodeCamera.camera = SCNCamera()
        rootNode.addChildNode(nodeCamera)

        let geoPyramid = SCNPyramid(width: 0.2, height: 0.5, length: 0.2)
        let nodeCenterOfUniverse = SCNNode(geometry: geoPyramid)
        nodeCenterOfUniverse.position = SCNVector3(0, 0, -5)
        nodeCenterOfUniverse.pivot = SCNMatrix4MakeRotation(CGFloat.pi/4, 0.0, 0.0, 1.0)
        rootNode.addChildNode(nodeCenterOfUniverse)

        let geoSphere = SCNSphere(radius: 0.3)
        let nodePlanet = SCNNode(geometry: geoSphere)
        nodePlanet.name = "planet"
        nodePlanet.position = SCNVector3(2, 0, 0)
        nodeCenterOfUniverse.addChildNode(nodePlanet)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder has not been implemented")
    }
}

SCNSceneRenderDelegate:

extension ViewController:SCNSceneRendererDelegate {
    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
        if let planet = scene.rootNode.childNode(withName: "planet", recursively: true) {
            let position = planet.convertPosition(planet.position, to: scene.rootNode)
            let screencoords = renderer.projectPoint(position)
            print (screencoords)

            # result:
            # SCNVector3(x: 461.913848876953, y: 2.58612823486328, z: 0.808080852031708)
            # y should clearly be more to the center of the screen somewhere between 100-200
        }
    }
}

有谁知道如何获得正确的屏幕坐标?



Best Answer-推荐答案


世界坐标中的行星位置似乎不正确。 当我手动计算行星位置时,我得到不同的结果,并且 projectPoints 像宣传的那样工作。 [我可能会发布一个关于 worldTransform 的不同问题]。

// using SIMD
let pivCou = float4x4(nodeCenterOfUniverse.pivot)
let posCou = float3(nodeCenterOfUniverse.position)
let posCou4 = float4(posCou.x, posCou.y, posCou.z, 1.0) // convert float3 to float4
let posPlanet = float3(nodePlanet.position)
let posPlanet4 = float4(posPlanet.x, posPlanet.y, posPlanet.z, 1.0)

let worldcoordinatesPlanet = posCou4 + posPlanet4 * pivCou

关于ios - 旋转 SCNNode.pivot 后 SceneKit 项目点不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44430385/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap