0
some bugs found in MeshBuilder
This discussion was imported from CodePlex
jpg99 wrote at 2012-08-15 15:17:
hello,
i'm using your toolkit for a project at work . I have to draw 3d houses from a 2D polygon (plane section of the house), so i experimented with AddExtrudedGeometry, and encountered several difficulties. Eventually i wrote my own function for building the 3d houses, and i don't remember precisely what the problems were (sorry it was a few weeks ago), mostly problems with triangles defined in the wrong sense so that the outside / inside were inversed.
Here is the code i corrected in MeshBuilder.cs :
public void AddExtrudedGeometry(IList points, Vector3D xaxis, Point3D p0, Point3D p1)
{
var ydirection = Vector3D.CrossProduct(xaxis, p0 - p1);
ydirection.Normalize();
xaxis.Normalize();
int np = 2 * points.Count;
foreach (var p in points)
{
int i0 = this.positions.Count;
var v = (xaxis * p.X) + (ydirection * p.Y);
this.positions.Add(p0 + v);
this.positions.Add(p1 + v);
v.Normalize();
if (this.normals != null)
{
this.normals.Add(v);
this.normals.Add(v);
}
if (this.textureCoordinates != null)
{
this.textureCoordinates.Add(new Point(0, 0));
this.textureCoordinates.Add(new Point(1, 0));
}
int i1 = i0 + 1;
int i2 = (i0 + 2) % np;
int i3 = i2 + 1;
this.triangleIndices.Add(i0);
this.triangleIndices.Add(i2);
this.triangleIndices.Add(i1);
this.triangleIndices.Add(i2);
this.triangleIndices.Add(i3);
this.triangleIndices.Add(i1);
}
}
public void AddTriangleFan(
IList fanPositions, IList fanNormals = null, IList fanTextureCoordinates = null)
{
if (this.positions == null)
{
throw new ArgumentNullException("fanPositions");
}
if (fanNormals != null && this.normals == null)
{
throw new ArgumentNullException("fanNormals");
}
if (fanTextureCoordinates != null && this.textureCoordinates == null)
{
throw new ArgumentNullException("fanTextureCoordinates");
}
int index0 = this.positions.Count;
foreach (var p in fanPositions)
{
this.positions.Add(p);
}
if (this.textureCoordinates != null && fanTextureCoordinates != null)
{
foreach (var tc in fanTextureCoordinates)
{
this.textureCoordinates.Add(tc);
}
}
if (this.normals != null && fanNormals != null)
{
foreach (var n in fanNormals)
{
this.normals.Add(n);
}
}
int indexEnd = this.positions.Count;
for (int i = index0; i + 2 < indexEnd; i += 3)
{
this.triangleIndices.Add(i);
this.triangleIndices.Add(i + 1);
this.triangleIndices.Add(i + 2);
}
}
objo wrote at 2012-08-24 09:49:
Thanks for the code! I added http://helixtoolkit.codeplex.com/workitem/9964
Customer support service by UserEcho