Java 3d 参数化曲面绘图
Java 3d parametric surfaces drawing
我真的需要你的帮助,因为我现在正在与未知数战斗一段时间。
我正在尝试在 java 3d 上绘制参数曲面。如果我使用点数组,则正在绘制表面。这是代码:
PointArray lsa=new PointArray(length, GeometryArray.COLOR_3|GeometryArray.NORMALS|GeometryArray.COORDINATES);
float maxV=(float) ((float) 2*Math.PI);
float maxU=(float) ((float) Math.PI);
Vector3f norm = new Vector3f();
for (float v = 0.01f; v < maxV; v+=0.03)
{
for (float u = 0.01f; u < maxU; u+=0.03)
{
vIndex++;
Point3f pt = new Point3f();
pt.x=(float) (Math.sin(u)*Math.cos(v));
pt.y=(float) (2*Math.sin(u)*Math.sin(v));
pt.z=(float) Math.cos(u);
lsa.setCoordinate(vIndex, pt);
lsa.setColor(vIndex, new Color3f(0.9f,0.0f,0.0f));
}
}
Shape3D shape = new Shape3D(lsa);
我遇到的问题是它只绘制点(点),所以它不是完整绘制的表面。我怎样才能用多边形或任何表面绘制这个参数化表面?有什么方法吗?
我在网上搜索,买了书,但我还是做不到 java 3d。
非常感谢。
这是我的做法。
我会定义一个
Point3f[][] points = new Point3f[(int)((umax-umin)/du)][(int)((vmax-vmin)/dv)];
然后使用类似于 int i = 0; i<points.length; i++
、int j = 0; j < points[0].length; j++
的循环。定义 u = i * du + umin
, v = j * dv + vmin
.
并用对应于 (u, v)
的 Point3f
填充此数组。
循环 int i = 0; i<points.length - 1; i++
、int j = 0; j < points[0].length - 1; j++
并得到 points[i][j]
、points[i+1][j]
、points[i][j+1]
和 points[i+1][j+1]
.[=25 处的点=]
然后使用this article中给出的方法将这些点转换为Polygon
。将其添加到您的模型/稍后添加到模型的数组。
当然,这可能不是最好的方法,我感觉它不能很好地处理不连续性,但它至少应该生成多边形。
你好,这里是解决方案,它绘制了一个 coons 曲面,例如,它应该适用于任何参数化曲面 x(s, t), y(s, t), z(s, t)。
public static Shape3D getShape3D()
{
//Coons
int ns=100;
int nt=100;
float param0=1.0f;
float param1=3.0f;
float s=0.0f;
float t=0.0f;
if (ns>500) ns=500;
if (nt>500) nt=500;
Point3f[][] f=new Point3f[ns][nt];
int sizeOfVectors=0;
for (int i=0;i<ns;i++) //t -->s
{
for (int j=0;j<nt;j++) //u ---t
{
s=((float) i/ns);
t=((float) j/nt);
//System.out.println(" i "+ i + " j "+ j + " s "+ s + " t "+ t);
f[i][j]=new Point3f();
//f[i][j].x=s;
//f[i][j].y=2*t;
//f[i][j].z=10*t*(1-s);
f[i][j].x=param0*s;
f[i][j].y=param1*t;
f[i][j].z=(float) (0.5*((54*s*Math.sqrt(s)-126*Math.sqrt(s)+72*s-6)*t+(27*Math.sqrt(s)-27*s+6)));
/*f[i][j].x = (float) (Math.sqrt(s)*Math.cos(t));
f[i][j].y=(float) (Math.sqrt(s)*Math.sin(t));
f[i][j].z=s;*/
sizeOfVectors++;
sizeOfVectors++;
}
}
System.out.println("Total vectors "+sizeOfVectors);
Shape3D plShape = new Shape3D();
int vIndex=-1;
int k=0;
for (int i=0;i<(ns-1);i++)
{
k=i+1;
sizeOfVectors=nt*2;
vIndex=-1;
TriangleStripArray lsa=new TriangleStripArray(sizeOfVectors, GeometryArray.COLOR_3|GeometryArray.COORDINATES|GeometryArray.NORMALS, new int[] {sizeOfVectors});
for (int j=0;j<nt;j++)
{
vIndex++;
lsa.setCoordinate(vIndex, f[i][j]);
lsa.setColor(vIndex, new Color3f(0.9f,0.0f,0.0f));
vIndex++;
lsa.setCoordinate(vIndex, f[k][j]);
lsa.setColor(vIndex, new Color3f(0.9f,0.0f,0.0f));
}
plShape.addGeometry(lsa);
}
return plShape;
}
一切如梦如幻。您的指导是最终成功的催化剂。
我真的需要你的帮助,因为我现在正在与未知数战斗一段时间。
我正在尝试在 java 3d 上绘制参数曲面。如果我使用点数组,则正在绘制表面。这是代码:
PointArray lsa=new PointArray(length, GeometryArray.COLOR_3|GeometryArray.NORMALS|GeometryArray.COORDINATES);
float maxV=(float) ((float) 2*Math.PI);
float maxU=(float) ((float) Math.PI);
Vector3f norm = new Vector3f();
for (float v = 0.01f; v < maxV; v+=0.03)
{
for (float u = 0.01f; u < maxU; u+=0.03)
{
vIndex++;
Point3f pt = new Point3f();
pt.x=(float) (Math.sin(u)*Math.cos(v));
pt.y=(float) (2*Math.sin(u)*Math.sin(v));
pt.z=(float) Math.cos(u);
lsa.setCoordinate(vIndex, pt);
lsa.setColor(vIndex, new Color3f(0.9f,0.0f,0.0f));
}
}
Shape3D shape = new Shape3D(lsa);
我遇到的问题是它只绘制点(点),所以它不是完整绘制的表面。我怎样才能用多边形或任何表面绘制这个参数化表面?有什么方法吗?
我在网上搜索,买了书,但我还是做不到 java 3d。
非常感谢。
这是我的做法。
我会定义一个
Point3f[][] points = new Point3f[(int)((umax-umin)/du)][(int)((vmax-vmin)/dv)];
然后使用类似于 int i = 0; i<points.length; i++
、int j = 0; j < points[0].length; j++
的循环。定义 u = i * du + umin
, v = j * dv + vmin
.
并用对应于 (u, v)
的 Point3f
填充此数组。
循环 int i = 0; i<points.length - 1; i++
、int j = 0; j < points[0].length - 1; j++
并得到 points[i][j]
、points[i+1][j]
、points[i][j+1]
和 points[i+1][j+1]
.[=25 处的点=]
然后使用this article中给出的方法将这些点转换为Polygon
。将其添加到您的模型/稍后添加到模型的数组。
当然,这可能不是最好的方法,我感觉它不能很好地处理不连续性,但它至少应该生成多边形。
你好,这里是解决方案,它绘制了一个 coons 曲面,例如,它应该适用于任何参数化曲面 x(s, t), y(s, t), z(s, t)。
public static Shape3D getShape3D()
{
//Coons
int ns=100;
int nt=100;
float param0=1.0f;
float param1=3.0f;
float s=0.0f;
float t=0.0f;
if (ns>500) ns=500;
if (nt>500) nt=500;
Point3f[][] f=new Point3f[ns][nt];
int sizeOfVectors=0;
for (int i=0;i<ns;i++) //t -->s
{
for (int j=0;j<nt;j++) //u ---t
{
s=((float) i/ns);
t=((float) j/nt);
//System.out.println(" i "+ i + " j "+ j + " s "+ s + " t "+ t);
f[i][j]=new Point3f();
//f[i][j].x=s;
//f[i][j].y=2*t;
//f[i][j].z=10*t*(1-s);
f[i][j].x=param0*s;
f[i][j].y=param1*t;
f[i][j].z=(float) (0.5*((54*s*Math.sqrt(s)-126*Math.sqrt(s)+72*s-6)*t+(27*Math.sqrt(s)-27*s+6)));
/*f[i][j].x = (float) (Math.sqrt(s)*Math.cos(t));
f[i][j].y=(float) (Math.sqrt(s)*Math.sin(t));
f[i][j].z=s;*/
sizeOfVectors++;
sizeOfVectors++;
}
}
System.out.println("Total vectors "+sizeOfVectors);
Shape3D plShape = new Shape3D();
int vIndex=-1;
int k=0;
for (int i=0;i<(ns-1);i++)
{
k=i+1;
sizeOfVectors=nt*2;
vIndex=-1;
TriangleStripArray lsa=new TriangleStripArray(sizeOfVectors, GeometryArray.COLOR_3|GeometryArray.COORDINATES|GeometryArray.NORMALS, new int[] {sizeOfVectors});
for (int j=0;j<nt;j++)
{
vIndex++;
lsa.setCoordinate(vIndex, f[i][j]);
lsa.setColor(vIndex, new Color3f(0.9f,0.0f,0.0f));
vIndex++;
lsa.setCoordinate(vIndex, f[k][j]);
lsa.setColor(vIndex, new Color3f(0.9f,0.0f,0.0f));
}
plShape.addGeometry(lsa);
}
return plShape;
}
一切如梦如幻。您的指导是最终成功的催化剂。