给出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)
答案 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)
没有简单的方式来做到这一点,但它也不应该那么难。您应该实现一个执行以下步骤的算法:
SCNVector3
d
是先前找到的距离)。
SCNCapsule
和SCNTube
,请将height
设置为距离SCNTorus
,请将ringRadius
设置为d/2-pipeRadius
SCNBox
,请将任意一方设为d
一旦你这样做,你创建的形状应该满足两端的点数。您可以使用边界框检查这是否正确,确保右轴等于距离。
我没有代码示例,但请试一试,如果它不起作用,我可以为您调试。