2

XCode のドキュメントには、3D ライン セグメントのテストを計画している場合、SCNRender、SCNView、または SCNNode 自体を使用して、SceneKit でのジオメトリのヒット テストを実行できることが明確に記載されています。レンダラーやビューのないノードで SCNScene を使用しているため、SCNNode hitTesting を使用する予定です。SCNScene を作成し、そこに SCNNode を配置して、通過する単純な光線をテストしますが、常に空の hitList が返され、その理由がわかりません。

import Swift
import SceneKit

let boxGeometry = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0)
let boxNode = SCNNode(geometry: boxGeometry)

var scene = SCNScene()
scene.rootNode.addChildNode(boxNode)

let from = SCNVector3(x: 0, y: -2, z: 0)
let to = SCNVector3(x: 0, y: 2 , z: 0)

var hits = scene.rootNode.hitTestWithSegmentFromPoint(from, toPoint: to, options:nil) // this is always empty
if hits != nil {
    if hits!.count > 0 {
        var hit = (hits!.first as! SCNHitTestResult).node as SCNNode
    }
}

さまざまな形式のオプションを渡そうとしましたが、何も変わりません。

  1. SCNHitTestFirstFoundOnlyKey: yes または no は何も変更しません
  2. SCNHitTestSortResultsKey: yes または no は何も変更しません
  3. SCNHitTestClipToZRangeKey: SCNNode では無効
  4. SCNHitTestBackFaceCullingKey: yes または no は何も変更しません
  5. SCNHitTestBoundingBoxOnlyKey: yes または no は何も変更しません
  6. SCNHitTestRootNodeKey: シーンまたは boxNode の rootNOde は何も変更しません
  7. SCNHitTestIgnoreHiddenNodesKey: yes または no は何も変更しません

私は何を間違っていますか?

4

2 に答える 2

1

バグまたは機能のいずれかである答えを見つけました。SCNScene とそのノード SCNNode を 3D ヒット テストに使用します。特に、「hitTestWithSegmentFromPoint(toPoint:options:)」というメソッドは、シーンがSCNView。オフスクリーンでは使用できないようです。なぜそうなるのかはあなたの推測ですが、グラフィックス カードでこれらの非常に高価な計算を実行することに関係があると想像できます。

これは、GameView SCNScene スターター プロジェクトを使用してテストしました。重要な行は self.gameView!.scene = scene です

override func awakeFromNib(){
    let scene = SCNScene()
    let boxGeometry = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.0)
    let boxNode = SCNNode(geometry: boxGeometry)
    boxNode.position=SCNVector3(x: 0, y: 0, z: 0)
    scene.rootNode.addChildNode(boxNode)

    // create and add a camera to the scene
    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    scene.rootNode.addChildNode(cameraNode)

    // place the camera
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)

    // create and add a light to the scene
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light!.type = SCNLightTypeOmni
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
    scene.rootNode.addChildNode(lightNode)

    // create and add an ambient light to the scene
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = SCNLightTypeAmbient
    ambientLightNode.light!.color = NSColor.darkGrayColor()
    scene.rootNode.addChildNode(ambientLightNode)

    // set the scene to the view
    // uncomment this to fail
    self.gameView!.scene = scene

    // allows the user to manipulate the camera
    self.gameView!.allowsCameraControl = true

    // show statistics such as fps and timing information
    self.gameView!.showsStatistics = true

    // configure the view
    self.gameView!.backgroundColor = NSColor.blackColor()

    let hitList = scene.rootNode.hitTestWithSegmentFromPoint(SCNVector3(x:-10,y:0,z:0), toPoint: SCNVector3(x:10,y:0,z:0), options:[SCNHitTestBackFaceCullingKey:false, SCNHitTestSortResultsKey:true, SCNHitTestIgnoreHiddenNodesKey:false])

    if hitList?.count > 0 {
        println("Hit found: \n\n\( hitList![0] )") // assign self.gameView!.scene = scene to reach this point.
    } else {
        println("No hit") // uncomment self.gameView!.scene = scene to reach this point.
    }

}
于 2015-03-26T19:26:05.277 に答える