Я пишу игру в Swift 5 (но у меня была та же проблема со Swift 4, которую я недавно обновил игрой), со всем моим SCNNode, сосредоточенным вокруг SCNVector3Zero. Другими словами (0,0,0) находится в центре моей игровой площадки.
SCNCamera присоединен к SNCNode и расположен за пределами игровой зоны, глядя на (0,0,0).
cameraNode.look(at: SCNVector3Zero)
Если я размещу 5 узлов в сцене, все на плоскости y = 0, (0,0,0), (-1,0, -1), (1,0,1), (-1, 0,1) и (1,0, -1), как лицо кости, показывающей пять, все это прекрасно работает. Я могу вращаться вокруг сцены с узлом в (0,0,0), оставаясь в центре без движения.
Если я добавлю 2-ую строку, то первая строка переместится на y = 1, а вторая строка получит узлы с y = -1, сцена немного покачивается при вращении.
Чем дальше узел перемещается из центра, тем более преувеличенным становится это колебание.
Вот код, устанавливающий сцену (этот пример имеет три строки и выглядит как трехмерная «пяти» грань игральных костей, точка в центре (0,0,0) и другие точки в каждом углу куб) ...
addSphere(
x: 0.0,
y: 0.0,
z: 0.0,
radius: radius,
textureName: "earth")
addSphere(
x: -2.0 * spacing,
y: -2.0 * spacing,
z: 0.0,
radius: radius,
textureName: "earth")
addSphere(
x: 2.0 * spacing,
y: 2.0 * spacing,
z: 0.0,
radius: radius,
textureName: "earth")
addSphere(
x: -2.0 * spacing,
y: 2.0 * spacing,
z: 0.0,
radius: radius,
textureName: "granite")
addSphere(
x: 2.0 * spacing,
y: -2.0 * spacing,
z: 0.0,
radius: radius,
textureName: "granite")
addSphere(
x: 0.0,
y: -2.0 * spacing,
z: -2.0 * spacing,
radius: radius,
textureName: "slime")
addSphere(
x: 0.0,
y: 2.0 * spacing,
z: 2.0 * spacing,
radius: radius,
textureName: "slime")
addSphere(
x: 0.0,
y: 2.0 * spacing,
z: -2.0 * spacing,
radius: radius,
textureName: "wood")
addSphere(
x: 0.0,
y: -2.0 * spacing,
z: 2.0 * spacing,
radius: radius,
textureName: "wood")
Этот код ведет себя, все симметрично вокруг (0,0,0) с узлом в (0,0,0), оставаясь именно там, где и должен.
Если я добавлю этот узел в сцену, все пойдет не так ...
addSphere(
x: 6.0,
y: 6.0,
z: 6.0,
radius: radius,
textureName: "earth")
Я пытался добавить фиксированное физическое тело к каждому узлу с нулевой массой, но безрезультатно. Это похоже на то, что камера больше не смотрит прямо на (0,0,0), но на нее влияют только узлы сцены.
Я пробовал все виды перестановок добавления узлов, и в некоторых тестах кажется, что добавление чего-либо со значением для оси z вызывало проблемы
Это метод addSphere ...
internal func addSphere(x: Float, y: Float, z: Float, radius: Float, color: UIColor, textureName: String) -> SCNNode {
let sphereGeometry = SCNSphere(radius: CGFloat(radius))
sphereGeometry.firstMaterial?.diffuse.contents = UIImage(imageLiteralResourceName: textureName)
let sphereNode = SCNNode(geometry: sphereGeometry)
sphereNode.name = "dot"
sphereNode.position = SCNVector3(x: x, y: y, z: z)
sphereNode.lines = [];
sphereNode.ignoreTaps = false
sphereNode.categoryBitMask = NodeBitMasks.dot
//sphereNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil)
self.rootNode.addChildNode(sphereNode)
return sphereNode
}
Ошибок нет, и, как и следовало ожидать, любая точка, расположенная в точке (0,0,0), должна оставаться статичной при вращении вокруг, глядя на эту точку.
Любые указатели были бы очень благодарны, так как я не могу понять, почему он так себя ведет.