我有两个SCNVector 3类型的点(我们称它们为pointA和pointB)。我想在它们之间画一条线。看起来应该很容易,但找不到方法。
我看到两个选项,都有问题:
- 使用半径小、长度|A点-B点|然后将其定位/旋转。
- 使用自定义SCNGeometry,但不确定如何使用;必须定义两个三角形才能形成一个很细的矩形?
似乎应该有一个更简单的方法来做这件事,但我似乎找不到一个。
编辑:使用三角形方法,在(0,0,0)和(10,10,10)之间画一条线,得到如下结果:
CGFloat delta = 0.1;
SCNVector3 positions[] = { SCNVector3Make(0,0,0),
SCNVector3Make(10, 10, 10),
SCNVector3Make(0+delta, 0+delta, 0+delta),
SCNVector3Make(10+delta, 10+delta, 10+delta)};
int indicies[] = {
0,2,1,
1,2,3
};
SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithVertices:positions count:4];
NSData *indexData = [NSData dataWithBytes:indicies length:sizeof(indicies)];
SCNGeometryElement *element = [SCNGeometryElement geometryElementWithData:indexData primitiveType:SCNGeometryPrimitiveTypeTriangles primitiveCount:2 bytesPerIndex:sizeof(int)];
SCNGeometry *line = [SCNGeometry geometryWithSources:@[vertexSource] elements:@[element]];
SCNNode *lineNode = [SCNNode nodeWithGeometry:line];
[root addChildNode:lineNode];
但也有问题:由于法线的原因,你只能从一边看到这条线!从另一边看不见它。另外,如果“delta”太小,你根本看不到这条线。实际上,它是一个矩形,而不是我想要的线,如果我想画多条连接起来的线,这可能会导致小的图形故障。
8条答案
按热度按时间rmbxnbpk1#
下面是Swift中的一个简单扩展:
aurhwmvo2#
有很多方法可以做到这一点。
如前所述,您的自定义几何图形方法有一些缺点。您应该可以通过为其材质赋予
doubleSided
属性来纠正从一侧不可见的问题。但是,您可能仍然会遇到二维几何图形的问题。你也可以修改你的自定义几何图形来包含更多的三角形,这样你就得到了一个有三个或更多边的管状图形,而不是一个扁平的矩形。或者在你的几何图形源中只有两个点,并使用
SCNGeometryPrimitiveTypeLine
几何元素类型让Scene Kit在它们之间绘制一条线段。(尽管你在渲染风格上不会像着色多边形那样灵活。)您还可以使用您提到的
SCNCylinder
方法(或任何其他内建基本形体)。请记住,几何图形是在它们自己的本机(也称为模型)坐标空间,场景工具包解释它相对于节点定义的坐标空间。换句话说,您可以定义一个圆柱体(或者盒子、胶囊、平面等等),所有维度的宽度都是1.0个单位,然后使用包含该几何体的SCNNode
的旋转/缩放/位置或变换,使其变长、变细并在两个点之间拉伸。(还要注意,由于线条将非常细,因此可以减少所使用的内置几何体的segmentCount
,因为太多细节将不可见。)另一个选项是
SCNShape
类,它可以让你从二维贝塞尔曲线创建一个拉伸的三维对象。计算出正确的变换来得到一个连接两个任意点的平面听起来像是一些有趣的数学运算,但是一旦你做了,你就可以很容易地把你的点连接到你选择的任何形状的线上。xdyibdwo3#
下面是从(0,0,0)到(10,10,10)的一行的新代码。我不确定它是否可以进一步改进。
tvmytwxo4#
这里有一个解决方案
如果您想更新线宽或与修改所绘制线条的属性相关的任何内容,您将需要使用SceneKit的渲染回调中的一个openGL调用:
lo8azlld5#
下面是swift5的一个版本:
wqlqzqxt6#
在ViewController.cs中定义矢量点并调用Draw函数,然后在最后一行上-它只是旋转它以查看点B。
创建一个静态CreateGeomery类,并将此静态方法放入其中
您可能还希望将这些实用工具方法放在静态帮助器类中
感谢我所有的Xamarin c#朋友们。
6ss1mwsb7#
这里有一个使用三角形的解决方案,它独立于直线的方向工作。它是使用叉积来构造的,以获得垂直于直线的点。因此,你需要一个小的SCNVector3扩展,但它可能在其他情况下也会派上用场。
SCNVector3扩展名:
pkmbmrz78#
快速版本
要生成具有特定位置和方向的圆柱体形式的线,让我们在SCNGeometry扩展中实现一个
cylinderLine()
类方法。这里最难的部分是三角函数(用于定义圆柱体的方向)。如下所示:剩下的就简单了。