第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何正確使用iOS(Swift)SceneKit SCNSceneRenderer

如何正確使用iOS(Swift)SceneKit SCNSceneRenderer

iOS
繁花如伊 2019-11-29 15:39:49
我正在iOS上使用SceneKit開發(fā)一些代碼,在我的代碼中,我想確定全局z平面上的x和y坐標(biāo),其中z為0.0,而x和y由輕擊手勢確定。我的設(shè)置如下:    override func viewDidLoad() {    super.viewDidLoad()    // create a new scene    let scene = SCNScene()    // create and add a camera to the scene    let cameraNode = SCNNode()    let camera = SCNCamera()    cameraNode.camera = camera    scene.rootNode.addChildNode(cameraNode)    // place the camera    cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)    // create and add an ambient light to the scene    let ambientLightNode = SCNNode()    ambientLightNode.light = SCNLight()    ambientLightNode.light.type = SCNLightTypeAmbient    ambientLightNode.light.color = UIColor.darkGrayColor()    scene.rootNode.addChildNode(ambientLightNode)    let triangleNode = SCNNode()    triangleNode.geometry = defineTriangle();    scene.rootNode.addChildNode(triangleNode)    // retrieve the SCNView    let scnView = self.view as SCNView    // set the scene to the view    scnView.scene = scene    // configure the view    scnView.backgroundColor = UIColor.blackColor()    // add a tap gesture recognizer    let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")    let gestureRecognizers = NSMutableArray()    gestureRecognizers.addObject(tapGesture)    scnView.gestureRecognizers = gestureRecognizers}如你看到的。我有一個(gè)三角形,該三角形的高度為4個(gè)單位,寬為4個(gè)單位,并設(shè)置在以x,y(0.0,0.0)為中心的z平面(z = 0)上。相機(jī)是默認(rèn)的SCNCamera,它沿負(fù)z方向看,我將其放置在(0,0,15)處。zNear和zFar的默認(rèn)值分別為1.0和100.0。在我的handleTap方法中,我獲取水龍頭的x和y屏幕坐標(biāo),并嘗試在z = 0.0的情況下查找x和y全局場景坐標(biāo)。我正在使用unprojectPoint的電話。unprojectPoint的文檔指示取消投影z坐標(biāo)為0.0的點(diǎn)將返回近裁剪平面上的點(diǎn);取消投影z坐標(biāo)為1.0的點(diǎn)將返回遠(yuǎn)裁剪平面上的點(diǎn)。盡管并沒有特別說明,對于兩者之間的點(diǎn),近平面和遠(yuǎn)平面之間存在線性關(guān)系,但我做出了這一假設(shè),并將screenZ的值計(jì)算為z =的近平面和遠(yuǎn)平面之間的距離百分比。 0平面位于。要查看答案,我可以單擊三角形的角附近,因?yàn)槲抑浪鼈冊谌肿鴺?biāo)中的位置。我的問題是,當(dāng)我開始更改相機(jī)上的zNear和zFar剪切平面時(shí),我沒有獲得正確的值,也沒有獲得一致的值。所以我的問題是,我該怎么做?最后,我將創(chuàng)建一個(gè)新的幾何并將其放置在與用戶單擊位置相對應(yīng)的z平面上。在此先感謝您的幫助。
查看完整描述

3 回答

?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

3D圖形管線中的典型深度緩沖區(qū)不是線性的。透視劃分導(dǎo)致歸一化設(shè)備坐標(biāo)中的深度處于不同的比例。(另請參見此處。)


因此,您要輸入的z坐標(biāo)unprojectPoint實(shí)際上并不是您想要的。


那么,如何找到與世界空間中的平面匹配的歸一化深度坐標(biāo)呢?好吧,如果該平面與相機(jī)正交(這就是您的相機(jī))是有幫助的。然后,您要做的就是在該平面上投影一個(gè)點(diǎn):


let projectedOrigin = gameView.projectPoint(SCNVector3Zero)

現(xiàn)在,您可以在3D視圖+歸一化深度空間中找到世界原點(diǎn)的位置。要將2D視圖空間中的其他點(diǎn)映射到該平面上,請使用此向量的z坐標(biāo):


let vp = gestureRecognizer.locationInView(scnView)

let vpWithZ = SCNVector3(x: vp.x, y: vp.y, z: projectedOrigin.z)

let worldPoint = gameView.unprojectPoint(vpWithZ)

這樣可以在世界空間中獲得一個(gè)點(diǎn),該點(diǎn)將單擊/點(diǎn)擊位置映射到z = 0平面,position如果要向用戶顯示該位置,則適合用作節(jié)點(diǎn)的位置。


(請注意,此方法僅在映射到垂直于相機(jī)視線方向的平面上才有效。如果要將視線坐標(biāo)映射到不同方向的表面上,則in中的歸一化深度值vpWithZ將不會(huì)恒定)


查看完整回答
反對 回復(fù) 2019-11-29
?
30秒到達(dá)戰(zhàn)場

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

經(jīng)過一些實(shí)驗(yàn)后,我們開發(fā)出了將觸摸點(diǎn)投影到場景中給定點(diǎn)任意深度的工具。


您需要進(jìn)行的修改是計(jì)算Z = 0平面與此線的交點(diǎn),這就是您的觀點(diǎn)。


private func touchPointToScenePoint(recognizer: UIGestureRecognizer) -> SCNVector3 {

    // Get touch point

    let touchPoint = recognizer.locationInView(sceneView)


    // Compute near & far points

    let nearVector = SCNVector3(x: Float(touchPoint.x), y: Float(touchPoint.y), z: 0)

    let nearScenePoint = sceneView.unprojectPoint(nearVector)

    let farVector = SCNVector3(x: Float(touchPoint.x), y: Float(touchPoint.y), z: 1)

    let farScenePoint = sceneView.unprojectPoint(farVector)


    // Compute view vector

    let viewVector = SCNVector3(x: Float(farScenePoint.x - nearScenePoint.x), y: Float(farScenePoint.y - nearScenePoint.y), z: Float(farScenePoint.z - nearScenePoint.z))


    // Normalize view vector

    let vectorLength = sqrt(viewVector.x*viewVector.x + viewVector.y*viewVector.y + viewVector.z*viewVector.z)

    let normalizedViewVector = SCNVector3(x: viewVector.x/vectorLength, y: viewVector.y/vectorLength, z: viewVector.z/vectorLength)


    // Scale normalized vector to find scene point

    let scale = Float(15)

    let scenePoint = SCNVector3(x: normalizedViewVector.x*scale, y: normalizedViewVector.y*scale, z: normalizedViewVector.z*scale)


    print("2D point: \(touchPoint). 3D point: \(nearScenePoint). Far point: \(farScenePoint). scene point: \(scenePoint)")


    // Return <scenePoint>

    return scenePoint

}


查看完整回答
反對 回復(fù) 2019-11-29
  • 3 回答
  • 0 關(guān)注
  • 883 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號