在 3D 中使线条变粗?
Make a line thicker in 3D?
参考这个问题
Drawing a line between two points using SceneKit
我在 3D 中画一条线,想用这段代码把它加粗
func renderer(aRenderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: NSTimeInterval) {
//Makes the lines thicker
glLineWidth(20)
}
但是不行,iOS8.2.
还有其他方法吗?
更新
来自文档
我确实添加了SCNSceneRendererDelegate
和一个有效的线宽,但仍然无法增加线宽。
您不能将任何号码分配给 glLineWidth()
。
您可以通过以下方式检查 glLineWidth()
的可能值范围:
glGetFloatv(GL_LINE_WIDTH_RANGE,sizes);
一个疯狂的想法是使用圆柱体来绘制线条 ;)。当我想要漂亮且可控的线条时我会使用它,但我不知道有一个方便的 OpenGl 函数可以做到这一点。
@G Alexander:给你我的圆柱体实现。这有点乏味,但这就是我目前所拥有的。
如果你给我点 p0
和 p1
,向量 normal=(p1-p0).normalize()
将是圆柱体的轴。
选择不在向量 Normal.
上的点 p2
q=(p2-p0).normalize();
normal.crossproduct(q)=v0;
normal.crossproduct(v0)=v1;
有了这两个向量,您可以使用以下函数将具有任意半径的圆沿圆柱体的轴堆叠起来(圆柱体是一堆圆):
public Circle make_circle(Point center, Vector v0, Vector v1, double radius)
{
Circle c;
for (double i = 0; i < 2 * Math.PI; i += 0.05)
{
Point p = new Point(center + radius * Math.Cos(i) * v0 + radius * Math.Sin(i) * v1);
c.Add(p);
}
return c;
}
你只需要使用这个函数沿着圆柱体的轴做圆:
List<Circle> Cylinder = new List<Circle>();
for(double i=0;i<1;i+=0.1)
{
Cylinder.add( make_circle(P0+i*normal, v0, v1,radius);
}
现在你应该取两个连续的圆,并通过均匀采样将它们与四边形连接起来。
因为我已经实现了圈子,所以我已经这样实现了。
一个更简单的实现方法是沿 x 轴制作圆,然后旋转并将其平移到 p0
并使其与法线对齐,或者如果您是 Glu 的粉丝,则使用 gluCylinder ... .
希望对你有用。
参考这个问题
Drawing a line between two points using SceneKit
我在 3D 中画一条线,想用这段代码把它加粗
func renderer(aRenderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: NSTimeInterval) {
//Makes the lines thicker
glLineWidth(20)
}
但是不行,iOS8.2.
还有其他方法吗?
更新
来自文档
我确实添加了SCNSceneRendererDelegate
和一个有效的线宽,但仍然无法增加线宽。
您不能将任何号码分配给 glLineWidth()
。
您可以通过以下方式检查 glLineWidth()
的可能值范围:
glGetFloatv(GL_LINE_WIDTH_RANGE,sizes);
一个疯狂的想法是使用圆柱体来绘制线条 ;)。当我想要漂亮且可控的线条时我会使用它,但我不知道有一个方便的 OpenGl 函数可以做到这一点。
@G Alexander:给你我的圆柱体实现。这有点乏味,但这就是我目前所拥有的。
如果你给我点 p0
和 p1
,向量 normal=(p1-p0).normalize()
将是圆柱体的轴。
选择不在向量 Normal.
q=(p2-p0).normalize();
normal.crossproduct(q)=v0;
normal.crossproduct(v0)=v1;
有了这两个向量,您可以使用以下函数将具有任意半径的圆沿圆柱体的轴堆叠起来(圆柱体是一堆圆):
public Circle make_circle(Point center, Vector v0, Vector v1, double radius)
{
Circle c;
for (double i = 0; i < 2 * Math.PI; i += 0.05)
{
Point p = new Point(center + radius * Math.Cos(i) * v0 + radius * Math.Sin(i) * v1);
c.Add(p);
}
return c;
}
你只需要使用这个函数沿着圆柱体的轴做圆:
List<Circle> Cylinder = new List<Circle>();
for(double i=0;i<1;i+=0.1)
{
Cylinder.add( make_circle(P0+i*normal, v0, v1,radius);
}
现在你应该取两个连续的圆,并通过均匀采样将它们与四边形连接起来。
因为我已经实现了圈子,所以我已经这样实现了。
一个更简单的实现方法是沿 x 轴制作圆,然后旋转并将其平移到 p0
并使其与法线对齐,或者如果您是 Glu 的粉丝,则使用 gluCylinder ... .
希望对你有用。