当前位置: 首页 > 面试题库 >

SCNCamera极限弧球旋转

微生翼
2023-03-14
问题内容

我有一个SCNCamera场景设置,可以围绕一个对象旋转。

限制相机围绕物体旋转的最佳方式是什么?

示例:除了能够围绕整个球体旋转之外,我如何将旋转限制为单个半球?

我的第一个尝试是查看.allowsCameraControl是否存在任何限制。找不到任何东西。

然后,我尝试使用c#Unity:鼠标轨道脚本,不走运。

关于如何解决或解决此问题的一些指示将非常有用。

var lastWidthRatio: Float = 0
var lastHeightRatio: Float = 0

let camera = SCNCamera()
let cameraNode = SCNNode()
let cameraOrbit = SCNNode()

override func viewDidLoad() {
    super.viewDidLoad()

    // create a new scene
    let scene = SCNScene(named: "art.scnassets/ship.scn")!

    // create and add a camera to the scene

    camera.usesOrthographicProjection = true
    camera.orthographicScale = 9
    camera.zNear = 0
    camera.zFar = 100

    cameraNode.position = SCNVector3(x: 0, y: 0, z: 50)
    cameraNode.camera = camera

    cameraOrbit.addChildNode(cameraNode)
    scene.rootNode.addChildNode(cameraOrbit)

    // retrieve the ship node
    let ship = scene.rootNode.childNodeWithName("ship", recursively: true)!

    // retrieve the SCNView
    let scnView = self.view as! SCNView

    // set the scene to the view
    scnView.scene = scene

    // add a tap gesture recognizer
    let gesture = UIPanGestureRecognizer(target: self, action: "panDetected:");
    scnView.addGestureRecognizer(gesture);
}


func panDetected(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(sender.view!)
    let widthRatio = Float(translation.x) / Float(sender.view!.frame.size.width) + lastWidthRatio
    let heightRatio = Float(translation.y) / Float(sender.view!.frame.size.height) + lastHeightRatio
    self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio
    self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio

    print(Float(-2 * M_PI) * widthRatio)
    if (sender.state == .Ended) {
        lastWidthRatio = widthRatio % 1
        lastHeightRatio = heightRatio % 1
    }
}

问题答案:

您似乎就快要到了,仅使用您引用的答案中的@Rickster代码。

您可以进行的更改将在以下几行中:

self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio
self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio

隐含地允许俯仰和偏航覆盖整个球体。那是您可以进行限制的地方。例如eulerAngles.x,您可以执行以下操作,而不是让音高()从0到-π变化

self.cameraOrbit.eulerAngles.x = Float(-M_PI_2) + Float(-M_PI_2) * heightRatio

使用全屏垂直滚动覆盖该范围,可以在-π/ 2和-π之间平滑地变化。或者,您可以在这两行中设置严格的最小/最大限制/检查,以约束到地球的特定区域。

(编辑以解决惯性注释)

对于旋转阻尼或惯性,我会使用内置的SceneKit
Physics进行处理,并可能将相机放在不可见(无几何形状)的SCNNode上。该相机节点变成了一个万向节,类似于本项目中采用的方法:一个完全由RubyMotion和SceneKit创建的交互式七英尺地球仪。

然后,虚拟万向节将SCNPhysicsBody带有some(您添加,默认情况下不附带一个)damping。或者,也许您将物理场放在中心对象上,然后给该对象一些东西angularDamping



 类似资料:
  • 问题内容: 我正在使用MySQL存储财务资料,并使用数据来构建每个帐户的所有交易记录等。出于性能方面的考虑-为了防止用户被庞大的表格所淹没-我对结果进行了分页。 现在,作为注册的一部分,我将显示该帐户的余额。因此,如果我每页显示20个事务,而我显示第二页,则使用如下数据: 事务0-19: 忽略它们-它们比正在查看的页面要新。 交易20-39: 从中选择所有内容-它们会显示出来。 事务40-??:

  • 我想创造一个和乒乓球一样的游戏。我创建了一个沿着圆周移动的桨。注意桨是弧形的。我想知道我如何检测球和桨之间的碰撞。为了更好地理解这个:http://gyazo.com/7bac8acdf0faf66005015d496498ca33球将在圆圈内,当与桨碰撞时反射出去。提前感谢!

  • 我想寻求有关使用巴比伦旋转的帮助。js框架。 我需要球体旋转45度,与对角圆对齐,对角圆有45度的方向,但我不明白。 我的代码在下面的链接中:https://codepen.io/polalas/pen/VwvaKwL 负责旋转的方法是loop()方法,每次渲染场景时都会触发该方法。 我想我对轮换处理不当。有人能帮忙吗?

  • 我想让散点“紧密”,即没有松弛,两边没有数据。当我从ploly的留档运行代码时,没有松弛(相同的笔记本,相同的内核)。 我将不胜感激任何建议。

  • 我和我的暴徒AI有麻烦 它在一定程度上起作用,但它的作用与我想要的相反,这意味着它向错误的方向旋转180度 这会告诉我目标在哪里,并计算出需要旋转的数字 它的弧度加上3.1etc等于180度,因为这样计算它的最小值为-3.141,最大值为3.141,但敌人的旋转是在0到6.28之间进行的,加上3.141使瞬变=在敌人旋转的范围内,而不是在敌人旋转的范围下3.141 不管怎么说,这就是我被困的地方。

  • Polar Electro Oy 对 Polar 产品提供全球有限保修。对于美国或加拿大的已出售产品,保修由 Polar Electro, Inc.提供。 Polar Electro Oy/Polar Electro Inc. 向 Polar 产品的原始消费者/购买者保证,自购买之日起两 (2) 年内,产品不会出现任何材料或工艺缺陷;不过若为硅胶腕带或塑料腕带,则保修期为自购买之日起一 (1) 年