Функция hitTest SK3DNode не находит правильный SCNNodeIOS

Программируем под IOS
Ответить
Anonymous
 Функция hitTest SK3DNode не находит правильный SCNNode

Сообщение Anonymous »

У меня есть минимальный код воспроизведения:

Код: Выделить всё

import SpriteKit
import GameplayKit

class MyGameScene3D: SCNScene {

weak var node3D: MyNode3D!

override init() {
super.init()

background.contents = UIColor.green

let playground = SCNNode()
playground.boundingBox = (
min: SCNVector3(x: 0, y: 0, z: 0),
max: SCNVector3(x: 10, y: 10, z: 10))
let box = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0))
box.position = SCNVector3(x: 5, y: 5, z: 5)
playground.addChildNode(box)

playground.position = SCNVector3(x: 0, y: 0, z: 0)
rootNode.addChildNode(playground)

let light = SCNLight()
light.type = .ambient
let lightNode = SCNNode()
lightNode.light = light
rootNode.addChildNode(lightNode)

let camera = SCNCamera()
let cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.eulerAngles = SCNVector3(x: -3.14/2, y: 0, z: 0)
cameraNode.position = SCNVector3(x: 5, y: 11, z: 5)
rootNode.addChildNode(cameraNode)

}

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

func handleTouchBegan(_ location: CGPoint) {
let res = node3D.hitTest(location)
print(res)
}
}

class MyNode3D: SK3DNode {

override func touchesBegan(_ touches: Set, with event: UIEvent?) {
let touch = touches.first!
let scene = scnScene as! MyGameScene3D
let location = touch.location(in: self)
print(location)
scene.handleTouchBegan(location)
}

}

class GameScene: SKScene {

init() {
super.init(size: CGSize(width: 500, height: 1000))
self.backgroundColor = .red
let node3D = MyNode3D()
let scene3D = MyGameScene3D()
node3D.scnScene = scene3D
scene3D.node3D = node3D
node3D.isUserInteractionEnabled = true
node3D.viewportSize = CGSize(width: 100, height: 200)
node3D.position = CGPoint(x: 50, y: 100)
addChild(node3D)

let up = SKSpriteNode(color: .blue, size: CGSize(width: 500, height: 10))
up.anchorPoint = CGPoint(x: 0, y:0)
up.position = CGPoint(x:0, y:200)
addChild(up)

let right = SKSpriteNode(color: .gray, size: CGSize(width: 10, height: 500))
right.anchorPoint = CGPoint(x:0,y: 0)
right.position = CGPoint(x:100, y:0)
addChild(right)

}

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

По сути, у меня есть SK3DNode размером 100x200, расположенный в левом нижнем углу экрана (см. снимок экрана ниже).
Затем в этом SK3DNode у меня есть SCNScene, где я помещаю узел Playground 10x10x10 в позицию (0, 0, 0). Затем я помещаю узел камеры прямо вверху игровой площадки в позиции (5, 11, 5), и камера смотрит вниз вдоль -y ось, с углом Эйлера = (-90, 0, 0).
Затем на этой площадке я поместил небольшой ящик размером 1x1x1, в центре игровой площадки в (5, 5, 5).
2 длинные полосы (серая и синяя) ) нужны только для обозначения границы SK3DNode.
Результат отображается правильно (см. снимок экрана ниже). Однако я не могу заставить тест на попадание работать. Я нажимаю на центральное поле 1x1x1 на экране, распечатываю правильные координаты, но результат проверки попадания пуст. Я хочу, чтобы при попадании туда попадал центральный блок 1x1x1. Как это сделать?
Изображение


Подробнее здесь: https://stackoverflow.com/questions/791 ... ht-scnnode
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»