Subject:
|
Re: VB - parts and transformation matrices, Z-ordering, optional lines, bow-tied quads - help!
|
Newsgroups:
|
lugnet.cad
|
Date:
|
Mon, 26 Mar 2001 16:13:29 GMT
|
Viewed:
|
485 times
|
| |
| |
In lugnet.cad, Daniel Crichton wrote:
> 1). If I load up 3626bp01.dat everything looks fine except the eyes, the
> disc and cut-out primitives are placed in the middle of the head and
> slightly rotated. I've toyed with the idea that the matrix I'm using is
> wrong but it works for every other subpart and primitive, so I'm a bit
> stuck. And it happens with all heads with eyes, and makes a complete mess of
> torsos with patterns. I'll post some outputs to Brickshelf if anyone is
> interested in helping and needs to see what is happening.
Sounds like it's a problem in your code to handle type-1 lines. Could you
post some images of the problem renders?
> 2). Z-ordering. At the moment I'm just drawing the polygons in the order
> they appear in the DAT files, but obviously I need to handle Z-ordering so
> that the parts are rendered correctly. Any idea on where I might find some
> sample VB code that could be applied to DAT files easily, or a pointer to
> algorithms I could write in VB to handle this?
You can't completely sort polygons by z-order -- some polygons cross each
other in z-depth.
Are you using a z-buffer to track the z-depth of each pixel in the x-y
raster? The basic, non-optimized approach is something like this:
' Module RenderLDraw
Private aZBuf() As Long ' Distance from viewer values
Private aImage() As Long ' RGB values or LDraw color codes
Private Const MaxDepth = 2147483647
Sub InitImage(iWidth, iHeight)
Dim i As Long, j As Long
Redim aZBuf(iWidth, iHeight) As Single
Redim aImage(iWidth, iHeight) As Single
For i = 0 to iWidth
For j = 0 to iHeight
aZBuf(i, j) = MaxDepth
Next j
Next i
End Sub
Sub DrawPoint(iColor, X, Y, Z)
' Is voxel(XYZ) closer to the viewer than the previous voxel
' which was mapped to pixel(XY)?
If Z < aZBuf(X, Y) Then
aImage(X, Y) = iColor
aZBuf(X, Y) = Z
End If
End Sub
Sub ProcessFile(whatever_params_are_necessary)
' Clear the scene
InitImage iWidth, iHeight
' Process the file. Whenever a voxel needs to be rendered, call DrawPoint.
End Sub
> 3). Any sample VB code on handling optional lines? At the moment I just have
> an option to turn them on and off, but if they're on I'm just drawing all
> the lines indicated by the points which makes a bit of a mess, and I'm
> having trouble sorting out the equations needed to work out which lines to
> draw (it's been over 10 years since I left school and my memory's going).
Basically, you transform all 4 points into the screen-world, and then use
the just the XY components for testing. One way to do the testing is to
construct a line-equation for P1P2, solve the equation using the P3X and
P4X, and see if P3Y and P4Y are both less or both more than the Y values
you solved for.
That's the long way around, there must be faster ways, but that's one
solution.
> 4). Any algorithms for sorting out bow-tied quads? I've found a few parts
> that don't render well at all, and it appears that the points are not stored
> in a clockwise/anti-clockwise direction, so my filled polygons come out as 2
> triangles meeting at vertices.
LDraw sorts the 4 vertices (mapped into the screen-world) by ascending Y,
then increments from min(Y) to max(Y), drawing horizontal lines between the
outermost X values at each Y. It's ugly and slow, but it does the job.
Steve
|
|
Message has 2 Replies:
Message is in Reply To:
8 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|