两点之间的SceneKit对象

时间:2015-05-12 11:56:36

标签: swift scenekit

给出2分3D( a b )和SCNCapsule,SCNTorus,SCNTube等, 如何定位对象,以便对象从 a 点开始,到 b 点结束?

Swift或Objective-C中的代码示例将不胜感激。

根据Moustachs的回答,我设法做了一个二维解决方案:

var v1 = SCNVector3(x: Float(a.x), y: Float(a.y), z: 0.0)
var v2 = SCNVector3(x: Float(b.x), y: Float(b.y), z: 0.0)

let height = CGFloat(v1.distance(v2))
var capsule = SCNCapsule(capRadius: 0.1, height: height)

var node = SCNNode(geometry: capsule)

var midpoint = (v1 + v2) / 2.0

node.position = midpoint

var rotp = v2 - midpoint

let rotx = atan2( rotp.y, rotp.x )
node.eulerAngles = SCNVector3Make(0.0, 0.0, rotx)

self.addChildNode(node)

我知道,完整的3D旋转有很多解决方案,但我不关心第三轴。尽管如此,似乎即使是第二轴旋转也不适合我。也许我的数学逃避了我。任何人都可以告诉我如何将这些代码提升到3D空间?

(我正在使用Swift和Kim Pedersens SCNVector3Extensions:https://github.com/devindazzle/SCNVector3Extensions

2 个答案:

答案 0 :(得分:7)

我给你带来了好消息!你可以链接两个点并在这个Vector上放一个SCNNode!

拿这个,享受两点之间的画线!

$.each($('.animation'), function() {
  $(this).data('offset-top', Math.round($(this).offset().top));
});

var wH = $(window).height();

$(window).on('scroll resize load touchmove', function () {
  var windowScroll = $(this).scrollTop();

  $.each($('.animation'), function() {
    if (windowScroll > (($(this).data('offset-top') + 200) - wH)){
      $(this).addClass('isShownClass');
    }
  });

});

答案 1 :(得分:1)

没有简单的方式来做到这一点,但它也不应该那么难。您应该实现一个执行以下步骤的算法:

  • 获取A& B的位置为SCNVector3
  • 弄清楚距离,中间点和那些矢量点之间的角度(它的基本矢量数学,你可以在网上找到很多代码样本)
  • 使用以下尺寸创建您想要的任何形状:(假设d是先前找到的距离)。
    • 对于SCNCapsuleSCNTube,请将height设置为距离
    • 对于SCNTorus,请将ringRadius设置为d/2-pipeRadius
    • 对于SCNBox,请将任意一方设为d
  • 将该形状移动到您之前找到的中间点
  • 使用点之间的角度旋转形状(可能需要调整轴)

一旦你这样做,你创建的形状应该满足两端的点数。您可以使用边界框检查这是否正确,确保右轴等于距离。

我没有代码示例,但请试一试,如果它不起作用,我可以为您调试。