タッチでSceneKitのノードを移動しようとしています。 ここでコードを使用しています:Move a specific node in SceneKit using touchtouchを使用してSceneKitのノードを移動する
問題は、私がpanGestureを開始するたびに、タッチするオブジェクトがシーンの左隅に移動を開始することです。その位置から移動して離しても問題ありません。パンニングが始まるたびに、オブジェクトは左隅からリセットされます。ズームアウトすると、この新しいズームレベルの角からリセットされます。
私のコードは次のとおりです。
globalPanRecognizer = UIPanGestureRecognizer(target: self,
action:#selector(ViewController.dragObject(_:)))
objectView.addGestureRecognizer(globalPanRecognizer)
これらの値は、次のとおりです。これを行うことによって呼び出され
func CGPointToSCNVector3(view: SCNView, depth: Float, point: CGPoint) -> SCNVector3 {
let projectedOrigin = view.projectPoint(SCNVector3Make(0, 0, depth))
let locationWithz = SCNVector3Make(Float(point.x), Float(point.y), projectedOrigin.z)
return view.unprojectPoint(locationWithz)
}
func dragObject(sender: UIPanGestureRecognizer){
if(movingNow){
let translation = sender.translationInView(sender.view!)
var result : SCNVector3 = CGPointToSCNVector3(objectView, depth: tappedObjectNode.position.z, point: translation)
tappedObjectNode.position = result
}
else{
let hitResults = objectView.hitTest(sender.locationInView(objectView), options: nil)
if hitResults.count > 0 {
movingNow = true
}
}
if(sender.state == UIGestureRecognizerState.Ended) {
}
}
と
override func viewDidLoad() {
super.viewDidLoad()
let scnView = objectView
scnView.backgroundColor = UIColor.whiteColor()
scnView.autoenablesDefaultLighting = true
scnView.allowsCameraControl = true
私は一時的にDragObject型前allowsCameraControlのパン機能を無効にしていますCGPointToSCNVector3への最初の呼び出しの内部で:
tappedObjectNodeの- 初期値:SCNVector3(X:0.100000001、Y:0.100000001、Z:3.0)
- projectedOrigin:SCNVector3(X:261.613159、Y:285.530396、Z:0.949569583) - これは異常に大きな ありますCGPointToSCNVector3によって返さ
- 値:SCNVector3(X:1.03418088、Y:1.9734658、Z:4.64346933)
IはCGPointToSCNVector3が、運の異なるバリエーションで果たしています。 この現象の原因は何ですか? おかげで、
を変更しました同じ動作をします。どのようにコードをコメントしたかわかりません。私はそれをやろうとしています。ありがとう –
私が言及したSOリンクのコメントにリンクされている@ricksterコードと同じ動作です。 if(movingNow){ let translation = sender.translationInView(sender.view!) var offset = objectView.unprojectPoint(SCNVector3Make(Float(translation.x)、Float(translation.y)、globalProjectedOrigin.z))//ステップ5 tappedObjectNode.position.x = globalOffset.x + offset.x //ステップ6であり、y及びz他 } { せhitResults = objectView.hitTest(sender.locationInView(objectView)、オプション:ゼロ) ..nextコメント } –
を継続: '場合hitResults.count> 0 { globalWorldCoordinates = hitResults [0] .worldCoordinates //ステップ2 globalProjectedOrigin = objectV (ここでコードの書式設定を行うことはできませんが、このコードの書式設定はできません。ごめんなさい) –