【问题标题】:set pivot of SCNNode to bounding volume center without changing the node's position将 SCNNode 的枢轴设置为边界体积中心而不改变节点的位置
【发布时间】:2016-11-18 09:06:37
【问题描述】:

我正在寻找一种方法来将 SCNNodes 的枢轴(通过导入 Collada 文件获得)设置到它们的质心(或它们的边界框的中心)。 我得到了中心

 SCNVector3 center;
CGFloat radius;
[node getBoundingSphereCenter:&center radius:&radius];

但是,当我尝试将节点的轴心(与中心的 3D 向量相对的 4D 向量)设置为中心时,节点的位置也会发生变化。

node.pivot = SCNMatrix4MakeTranslation(center.x,center.y,center.z);

我怎样才能抵消这种运动 - 分别。我怎样才能只改变节点的枢轴而不影响它在空间中的位置? 或者有没有办法(不使用额外的空节点)在 Interface Builder 中做到这一点?

【问题讨论】:

  • 以下答案对您有用还是您找到了其他解决方案?
  • 您好,我尝试了以下答案-但是我仍然在错误的地方有一些节点。我必须坚持的解决方案是在外部 3D 编辑器 (Blender) 中更改每个模型部件的轴心并再次导出 DAE 文件。

标签: ios objective-c scenekit


【解决方案1】:

Is it normal for an SCNNode pivot to change the nodes position? 这里也提出了同样的问题……但在网上搜索了几个小时后,我找不到任何解决此问题的编码解决方案。这是如何在不移动节点的情况下使节点的枢轴居中

所以最后我今天大部分时间都花在了下面这个编码的答案上。 我发现局部轴的方向决定了您是减去还是加法校正因子。

在下面骑这辆自行车。右侧踏板曲柄枢轴 z 轴(蓝色)指向上方,而在另一张照片中,左侧踏板曲柄枢轴 z 轴(蓝色)指向下方。这些轴不同的原因是当人们在 SketchUp 中绘制自行车模型时,他们只是将第一个踏板曲柄复制并翻转到另一侧。所以不幸的是,获得具有特定枢轴方向和位置的导入 DAE 模型是很常见的!

 func centerPivotWithOutMoving(for node: SCNNode) -> SCNNode {

    let initialPos = activeNode.presentation.position

    var min = SCNVector3Zero
    var max = SCNVector3Zero
    node.__getBoundingBoxMin(&min, max: &max)

    node.pivot = SCNMatrix4MakeTranslation(
        min.x + (max.x - min.x)/2,
        min.y + (max.y - min.y)/2,
        min.z + (max.z - min.z)/2
    )
    let correctX = Float(min.x + (max.x - min.x)/2)
    let correctY = Float(min.y + (max.y - min.y)/2)
    let correctZ = Float(min.z + (max.z - min.z)/2)

    if node.convertVector(SCNVector3(0,0,1), from: parentNode).z < 0 {
        // if blue local z-axis is pointing downwards
        node.position = SCNVector3(initialPos.x - correctX, initialPos.y - correctY, initialPos.z - correctZ)
    } else {
        // if blue local z-axis is pointing upwards
        node.position = SCNVector3(initialPos.x + correctX, initialPos.y + correctY, initialPos.z + correctZ)
    }

    return node
}

我只在上面显示的两个不同的 z 轴方向上测试了上面的代码,完整的代码还必须使用这两个条件来处理 x、y 轴。

  node.convertVector(SCNVector3(0,1,0), from: parentNode).z < 0

  node.convertVector(SCNVector3(1,0,0), from: parentNode).z < 0   

如果有更好的方法...请分享?

【讨论】:

    【解决方案2】:

    枢轴不仅是旋转中心,还是节点位置的参考点。重置枢轴时,枢轴相对于父对象的位置保持固定。实际上,您是在相对于对象的当前位置移动几何体。

    简单的解决方法是使用用于重置枢轴的负值重新定位节点。如果由于某种原因,您需要一个不允许这样做的特定值,请将您的节点放在容器节点中,并使用容器节点进行定位,使用重新旋转的节点进行旋转。

    【讨论】:

    • 这个解决方案对我有用(使用波前 obj 模型)
    猜你喜欢
    • 2015-04-17
    • 2019-05-02
    • 2013-08-13
    • 2019-06-10
    • 2021-12-04
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多