Seite 8 von 10

Verfasst: 20.12.2006 17:04
von Kaeru Gaman
ein torus ist ein Polynom vierten grades...

irgendwo in der POV-Help stand die formel.. jedenfalls in der alten...

btw:
bei POV fand ich die difference{} funktion immer sehr praktisch für CSG.
sie subtrahiert die weiteren simple-shapes vom ersten.

Verfasst: 20.12.2006 17:17
von Spirit

Verfasst: 20.12.2006 17:32
von Creature
ein torus in glbasic ( mit opengl als api)... sollte sich nicht allzuschwer nach PB konvertieren lassen

Code: Alles auswählen

// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
    // Diese Variablen sind als LOCAL definiert:
    // x, y,
    // Draw the torus
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r
    X_OBJSTART num
    FOR di=0 TO NumWraps-1
        FOR j=0 TO NumPerWrap
            FOR i=di+1 TO di STEP -1
                wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
                wrapFracTex = j/NumPerWrap
                phi = 360*wrapFrac
                thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
                thetaFracTex = (i+wrapFracTex)/NumWraps
                theta = 360*thetaFrac
                r = MajorRadius + MinorRadius*COS(phi)
                x = SIN(theta)*r
                z = COS(theta)*r
                y = MinorRadius*SIN(phi)
                X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, wrapFracTex*TextureWrapHoriz, RGB(255, 255, 255)
            NEXT
        NEXT
        X_OBJNEWGROUP
    NEXT
    X_OBJEND
ENDFUNCTION
[/code]

Verfasst: 20.12.2006 19:59
von NicTheQuick
@Kaeru, Spirit, Creature:

Wäre schön, wenn es so einfach wäre, aber im Grunde müsste es so
aussehen:
Input: Torus(Mittelpunkt, Normale, Radius1, Radius2), Strahl(Start, Richtung)
Output: mindestens Schnittpunkt und die Normale am Schnittpunkt

@Kaeru:
CSG kommt auch noch rein. Zunächst aber wohl nur das Addieren und
Subtrahieren von Körpern. Irgendwelche komplexen Formen mit AND, OR,
XOR, NOT, usw. sind mir erstmal zu kompliziert.

@all:
Mir ist aufgefallen, dass ich im letzten Screenshot die Schatten nicht
angeschaltet hatte. Das war zu Testzwecken aus. Außerdem ist mir eben aufgefallen, dass die Glanz-Berechnung fehlerhaft war.

Deshalb hier ein neuer Screenshot:
Bild

Verfasst: 20.12.2006 20:08
von Kaeru Gaman
> Wäre schön, wenn es so einfach wäre, aber im Grunde müsste es so
aussehen:

ja sorry, aber der schnitt Strahl/Polynom muss ja für jede oberfläche ermittelt werden.
POV arbeitet halt mit Polynomen und hat die sonderfälle der simple-shapes extra definiert,
damit man im script eben nicht für jedes simple das polynom hinschreiben muss...

bei den polynomen stoße ich an die grenzen meiner fähigkeiten...
ich kann zwar nen Raytracer gut benutzen, aber proggen könnnt' ich keinen.

@screenshot
verd... das sieht ja schweinegeil aus...

wie ist eigentlich das interface... wird die engine mit nem script versorgt,
oder gibts vorab-erstell-routinen die nen Mem-bereich mit daten füllen?

Verfasst: 20.12.2006 20:53
von NicTheQuick
Ja, okay, Polynome sind mir momentan noch zu hoch. <)
Kaeru Gaman hat geschrieben:wie ist eigentlich das interface... wird die engine mit nem script versorgt,
oder gibts vorab-erstell-routinen die nen Mem-bereich mit daten füllen?
Scripte gibt es noch keine, aber das ist ja einfach im Gegensatz zum Rest.

Wenn du eine Welt erstellen willst, sieht das so aus. Ich mach mal ein
Beispiel in Pseudo-Code:

Code: Alles auswählen

*RT.RT = RT_New()

*RT\BackgroundRGB(0, 0, 0)      ;Hintergrundfarbe (wenn keine Objekt getroffen wird) [Standard]
*RT\AmbientLightRGB(0, 0, 0)    ;Umgebungslicht [Standard]

*Object.RTObject = *RT\NewObject(#RT_Object_Sphere) ;Erstelle eine Kugel
*Object\Radius(2)               ;Radius
*Object\PositionXYZ(0, 0, 10)   ;Position des Mittelpunktes
*Object\ColorRGB(1, 0.5, 0.25)  ;Farbe (r, g, b)
*Object\DirectLight(1.0)        ;Direktes Licht [Standard]
*Object\Reflection(0.5)         ;Verspiegelung
*Object\Transparency(0.25)      ;Transparenz
*Object\Refraction(1.33)        ;Wasser

*Light.RTLight = *RT\NewLight(#RT_Light_Point) ;Erstelle ein Punktlicht
*Light\PositionXYZ(0, 0, 0)     ;Position [Standard]
*Light\Color(1, 1, 1)           ;Farbe

*Cam.RTCam = *RT\NewCam(100, 100) ;Erstelle eine Kamera
*Cam\PositionXYZ(0, 0, 0)       ;Position [Standard]
*Cam\AngleXYZ(0, 0, 0)          ;Winkel (Blick auf die Kugel) [Standard]
*Cam\FOV(45)                    ;Objektivöffnungwinkel [Standard]
*Cam\Gamma(1)                   ;Gamma (praktisch für zu helle oder zu dunkle Bilder) [Standard]
*Cam\RecursionDepth(4)          ;max. Rekursionen (für Transparenz und Verspiegelungen)
*Cam\PixelSize(1)               ;Pixelgröße (1x1, 2x2, 3x3, 4x4, ...) [Standard]

;Rendern
*Cam\CalculateRays()            ;Muss aufgerufen werden, wenn FOV und Winkel geändert wurden

StartDrawing(Output)
  *Cam\Draw(0, 0)               ;Rendert das Bild mit Plot zeilenweise
StopDrawing()

*RT\Free()

Verfasst: 20.12.2006 21:17
von Creature
Kaeru Gaman hat geschrieben: @screenshot
verd... das sieht ja schweinegeil aus...
dem schließe ich mich an, gute arbeit, fettes kompliment :allright:

Verfasst: 21.12.2006 00:48
von NicTheQuick
Ich hatte gerade Lust ein paar Screenies zu machen.

Ein paar Kugeln mit zufälligem Glanz, verschiedenen Farben und
unterschiedlich starken Verspiegelungen

Bild

50 farbige Kugeln ohne Verspiegelung, aber mit Glanz und 4 Lichtquellen
oben (rot), links (blau), rechts (grün) und unten (gelb)

Bild

Das selbe nochmal mit Verspiegelungen
Bild

Und wieder, aber mit grauen Kugeln
Bild

Diesesmal 100 Kugeln und eine graue verspiegelte Ebene im
Hintergrund

Bild

Verfasst: 21.12.2006 01:55
von Falko
Hi NTQ, wenn ich die schönen Bilder sehe, fällt mir gleich wieder die
ID zur CNC-Simulation ein :allright:

Aber leider habe ich ein Problem unter PB 4.02. Wenn ich die
RTEngine ins Purebasci - Userlibraryverzeichnis lade, sind auf einmal
Startdrawing(), WindowID() und noch einige anderen wichtigen Funktionen
auf einmal verschwunden. PB kennt diese auf einmal nicht mehr, obwohl es untern in der Statusleiste beim eingeben angezeigt wird. Woran kann das
liegen?
Denn wenn ich diese Lib wieder entferne ist alles wieder in Ordnung.

Grüße ..Falko

Verfasst: 21.12.2006 02:19
von NicTheQuick
@Falko:
Die Lib ist ja auch noch für PB V3.94. Eine neue Library gibt es bisher noch
nicht, weil noch zu viele Bugs enthalten sind, vor allem, was die
Berechnungen angeht.

Also musst du leider noch eine Weile warten. :|