我有一个简单的3D区域,包含4个墙,每个墙是一个SCNNode,具有简单的SCNBox几何形状,矩形形状,并附上匹配的SCNPhysicsBody。SCNPhysicsBody使用SCNPhysicsShape.ShapeType.BoundingBox,并设置为静态类型。下面是一段代码片段:
let size = (self.levelNode.boundingBox.max - self.levelNode.boundingBox.min) * self.levelNode.scale
//x //z
let geometryA = SCNBox(width: CGFloat(size.x), height: CGFloat(1 * self.levelNode.scale.x), length: 0.01, chamferRadius: 0)
let geometryB = SCNBox(width: CGFloat(size.z), height: CGFloat(1 * self.levelNode.scale.x), length: 0.01, chamferRadius: 0)
geometryA.firstMaterial?.diffuse.contents = UIColor(red: 0.0, green: 0.2, blue: 1.0, alpha: 0.65)
geometryB.firstMaterial?.diffuse.contents = UIColor(red: 0.0, green: 0.2, blue: 1.0, alpha: 0.65)
let nodeA = SCNNode(geometry: geometryA)
nodeA.position += self.levelNode.position
nodeA.position += SCNVector3(0, 0.25 * self.levelNode.scale.y, -size.z/2)
nodeA.name = "Boundary-01"
let nodeB = SCNNode(geometry: geometryA)
nodeB.position += self.levelNode.position
nodeB.position += SCNVector3(0, 0.25 * self.levelNode.scale.y, size.z/2)
nodeB.name = "Boundary-03"
let nodeC = SCNNode(geometry: geometryB)
nodeC.position += self.levelNode.position
nodeC.position += SCNVector3(-size.x/2, 0.25 * self.levelNode.scale.y, 0)
nodeC.eulerAngles = SCNVector3(0, -Float.pi/2, 0)
nodeC.name = "Boundary-02"
let nodeD = SCNNode(geometry: geometryB)
nodeD.position += self.levelNode.position
nodeD.position += SCNVector3(size.x/2, 0.25 * self.levelNode.scale.y, 0)
nodeD.eulerAngles = SCNVector3(0, Float.pi/2, 0)
nodeD.name = "Boundary-04"
let nodes = [nodeA, nodeB, nodeC, nodeD]
for node in nodes {
//
let shape = SCNPhysicsShape(geometry: node.geometry!, options: [
SCNPhysicsShape.Option.type : SCNPhysicsShape.ShapeType.boundingBox])
let body = SCNPhysicsBody(type: .static, shape: shape)
node.physicsBody = body
node.physicsBody?.isAffectedByGravity = false
node.physicsBody?.categoryBitMask = Bitmask.boundary.rawValue
node.physicsBody?.contactTestBitMask = Bitmask.edge.rawValue
node.physicsBody?.collisionBitMask = 0
scene.rootNode.addChildNode(node)
node.physicsBody?.resetTransform()
}
在这个区域内,我以固定的时间间隔生成实体。每一个都有一个SCNBox几何形状,这一次是一个立方体形状,比墙小,物理体的参数与上面相同。
为了简化我的实体在这个游戏区域内的行为,我正在计算它们的行进路径,然后应用一个SCNAction到相关节点来移动它们。SCNAction同时移动连接到它的节点和物理体。
我正在使用SCNPhysicsWorld联系人委托来检测实体何时到达边界墙之一。然后,我为它计算一个从墙壁向另一个方向随机轨迹,清除它的动作,并应用一个新的移动SCNAction。
但是当我在ARKit中将这个“世界”的比例改成更小的,比方说相当于10cm的宽度时,模拟就分崩离析了。
当检测到实体与边界节点之间的接触时,它们之间具有相对较大的可见间隙。但接触穿透距离和以前一样大。
我打开了ARSCNView调试选项来显示呈现中的物理形状,它们看起来都是正确的比例,匹配其节点的边界框。
在苹果的文档中,它确实声明如果SCNPhysicsBody不是自定义形状,它将采用应用于它的节点几何形状的比例。我不受此影响,因为我正在生成几何和它们各自的节点,在缩放已经应用到级别之后。
目前的一个假设是,物理模拟在如此小的尺度下就会分崩离析。但我不是依靠模拟力来移动尸体...
有没有更合适的方式来缩放物理学世界?
或者,我是不是盯着SCNPhysicsWorld的一个窃听器,那是我目前无法控制的事情。
我曾经考虑过的一个解决方案是以1:1的比例运行整个模拟,但隐藏起来,然后将这些运动应用到较小的实体上。可以想象,那会影响整个场景的表现……
第一触点的穿透距离为负值,提示存在间隙。当您缩小模拟的大小时,这个差距似乎不会缩小。
作为解决上述问题的一种方法,我对Contact委托中的Contact执行了一个附加检查,以不使用针对特定类别检测到的第一个Contact,而是确保penetrationDistance值为正,从而确保在触发与边界连接的实体的方向改变之前,两个对象之间存在重叠。
我观察球体在场景中的行为。当施加力(或设定速度)时,球体会瞬间向右侧跳出远距离,然后缓慢地向后(向左)移动到其先前设定的位置(0,1,0)。我能看见它穿过墙。 现在我的问题是: > 为什么它向右跳(而不是移动)?我玩过冲量和速度的大小,但总是一样的。 我想要达到的行为是,在施加力后,球在我的盒子里反弹,根据物理设置。 有什么想法吗?多谢了。
获取实例 $config = [ 'corp_id' => 'xxxxxxxxxxxxxxxxx', 'secret' => 'xxxxxxxxxx', ... ]; $app = Factory::work($config); // 基础接口 $app->external_contact; // 「联系我」 $app->contact_way; // 消息管
M600 会显示您存储在 Google Contacts(Google 联系人)上的联系人信息。您可以呼叫联系人或给他们发送信息或电子邮件。 *请注意,由于手机的操作系统的不同,其通讯功能的使用会受到某些限制。
我正在为我的项目构建一个ajax/php联系表单,包含以下字段: 姓名(必填)、电子邮件(必填)、主题(必填)和网站(必填) 一切正常,现在唯一的问题是,如果用户没有在主题和或网站字段中键入任何内容,我收到的电子邮件显示这两个字段如下: 主题:(显示空白) 网址:(显示空白) 如果用户没有在我收到的电子邮件中键入任何内容,是否可能根本不显示这两个字段 名称:[用户名] 邮箱:[用户邮箱地址] 我只
我正在使用oauth 1.0,到目前为止,我可以成功地从谷歌获得访问令牌。但是当我想从https://www.google.com/m8/feeds/contacts/default/full检索用户联系人时,它返回401错误,没有进一步的解释。 我发现来自Google playground的信息可能不太准确,例如,步骤3和步骤5中的签名基本字符串包含oauth_version,但它是错误的。(如
问题内容: 您好,我已经仔细阅读了文档,无法弄清楚如何在场景工具包中设置碰撞检测。可以请一个例子。请帮我,我非常渴望解决这个问题。谢谢! 编辑:您好,非常感谢,对不起,我忘了提及我的项目进展迅速。没什么大不了的,我大部分时间都可以自我翻译。 当对象碰撞并相互反弹时,我使BitMasks正常工作。但是我似乎无法使该功能正常工作 查看文档,看来我需要以某种方式将场景物理世界委托分配给该方法。我不确定该