当前位置: 首页 > 知识库问答 >
问题:

SceneKit应用扭矩

范翰海
2023-03-14

然而,在我的测试中,似乎物理动画并不影响物体的实际位置。因此,轴保持静态(即使实际节点明显移动)。这导致扭矩总是从相同的方向施加(在场景启动时,无论z轴在哪里)。

我希望能够施加扭矩,使其相对于对象总是恒定的(例如,使节点绕节点的presentationNode的z轴逆时针旋转,而不是场景启动时节点的位置(has?))

共有1个答案

向弘懿
2023-03-14

SceneKit使用每个节点的两个版本:model节点定义静态行为,而presentation节点实际涉及动态行为并在屏幕上使用。此划分镜像了核心动画中使用的功能,并启用了隐式动画等功能(在隐式动画中,您可以执行设置node.position并将其动画为新值等操作,而无需在动画期间查询node.position代码的其他部分处理中间值)。

物理操作在表示节点上,但在某些情况下--比如这一个--在场景空间中接受输入。

然而,表示节点和场景之间唯一的区别是在坐标空间方面,所以你需要做的只是将你的向量从表示空间转换到场景空间。(场景的根节点不应该被物理、动作或飞行中的动画所改变,所以模型场景空间和演示场景空间之间没有实际的区别。)为此,请使用SceneKit提供的坐标转换方法之一,例如convertPosition:fromnode:

这里有一个快速游乐场可以说明你的两难处境:

import Cocoa
import SceneKit
import XCPlayground

// Set up a scene for our tests
let scene = SCNScene()
let view = SCNView(frame: NSRect(x: 0, y: 0, width: 500, height: 500))
view.autoenablesDefaultLighting = true
view.scene = scene
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 5)
scene.rootNode.addChildNode(cameraNode)
XCPShowView("view", view)

// Make a pyramid to test on
let node = SCNNode(geometry: SCNPyramid(width: 1, height: 1, length: 1))
scene.rootNode.addChildNode(node)
node.physicsBody = SCNPhysicsBody.dynamicBody()
scene.physicsWorld.gravity = SCNVector3Zero // Don't fall off screen

// Rotate around the axis that looks into the screen
node.physicsBody?.applyTorque(SCNVector4(x: 0, y: 0, z: 1, w: 0.1), impulse: true)

// Wait a bit, then try to rotate around the y-axis
node.runAction(SCNAction.waitForDuration(10), completionHandler: {
    var axis = SCNVector3(x: 0, y: 1, z: 0)
    node.physicsBody?.applyTorque(SCNVector4(x: axis.x, y: axis.y, z: axis.z, w: 1), impulse: true)
})

第二个旋转有效地使金字塔围绕屏幕的y轴旋转,而不是金字塔的y轴--穿过金字塔顶点的y轴。正如你所注意到的,在第一次旋转之前,它是围绕金字塔的y轴旋转的;即场景的y轴(不受物理影响),而不是表示节点的y轴(通过物理旋转)。

要修复它,请插入以下行(在以var axis开头的行之后):

axis = scene.rootNode.convertPosition(axis, fromNode: node.presentationNode())
 类似资料:
  • SceneKit-AdvancedStarterProject 为 SceneKit 3D 游戏开发提供了强有力的基础。它可以应用在 OS X 和 iOS 开发上。

  • 问题内容: 什么是Twisted最接近的Java替代方案? 问题答案: 与斯蒂芬(Stephane)一样,我建议您看一下Mina。它是异步网络IO的框架。它建立在前面提到的NIO之上,并且IMO隐藏了与Selectors,Channels等有关的一些复杂性。我已经使用Mina进行了几个项目,其效果相当不错,但是请注意,我发现文档有些薄弱。再有,就像Stephane提到的那样,它并没有对太多协议的现

  • After Effects 包括大量扭曲效果,同时具有本机和第三方增效工具,用于图像的扭曲(变形)。变形效果的功能包括可校正或稳定含果冻效应扭曲的图像。 贝塞尔曲线变形效果 贝塞尔曲线变形效果可沿图层边界,使用封闭的贝塞尔曲线形成图像。曲线包括四段。每段有三个点(一个顶点和两个切点)。 Andrew Kramer 在其 Video Copilot 网站上提供了一个视频教程,用于演示如何使用贝塞尔曲

  • 问题内容: 最近,我问了一个问题,其中有一个很明显的答案。我仍在同一个项目上,遇到另一个问题。我需要实现每帧逻辑,并且该协议在iOS上工作得很好,但是在OSX上,该功能未触发。我创建了一个小示例项目来说明我的问题。它由情节提要中的Scene Kit视图和该类中的以下代码组成: 我想要的基本上是每帧移动立方体。但是什么也没发生。什么是奇怪的是,当我设置到时,每当我点击或在屏幕上拖动(这是有道理的,因

  • 问题内容: 谁能推荐一些简单的代码来使用Twisted设置简单的JSON RPC客户端和服务器? 我找到了txJSON-RPC,但我想知道是否有人对使用这些anc有一定的经验可以推荐一些东西。 问题答案: txJSONRPC很棒。我使用它,并且有效。我建议您尝试一下。 客户: 作为奖励,我将保留一些替代方案:放大器。 http://amp-protocol.net

  • 问题内容: 我正在iOS上使用SceneKit开发一些代码,在我的代码中,我想确定全局z平面上的x和y坐标,其中z为0.0,而x和y由轻击手势确定。我的设置如下: 如你看到的。我有一个三角形,该三角形的高度为4个单位,宽为4个单位,并设置在以x,y(0.0,0.0)为中心的z平面(z = 0)上。相机是默认的SCNCamera,它沿负z方向看,我将其放置在(0,0,15)处。zNear和zFar的