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:

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

Verfasst: 21.12.2006 00:48
von NicTheQuick
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
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.
