Frage zu X_OBJADDVERTEX

Previous topic - Next topic

Quentin

Da wir zur Zeit unser Häuschen umbauen und wir uns das (zwecks Farbgebung) besser vorstellen können wollen, hab ich spaßeshalber mal ein ein 3D-Model des Hauses erstellt und zwar mit XOBJ.. - Befehlen. Das klappt auch schon ganz gut. Allerdings fällt mir auf, daß, wenn ich Objekte, die umittelbar nebeneinander liegen sollen, z.B. Mauer und Fenster, einen unschönen Zwischenraum aufweisen.

Um das zu verdeutlichen, habe ich mal ein kleines Beispiel gemacht, bei dem dieser Effekt auch auftritt. Einfach ein Stück Mauer als Objekt 0 und die entsprechende Tür als Objekt 1. Beide sollten eigentlich randlos ineinander übergehen. Am linken Rand der Tür zeigt sich jedoch eine kleine Lücke, die ich mir beim besten Willen nicht erklären kann.

Mache ich hier prinzipiell etwas falsch? Also altbekannte Frage: Bug oder Feature?

(mit den Cursortasten kann man das Modellchen um den Mittelpunkt drehen. Mit "W" näher heranzoomen, mit "S" wieder weiter weg zoomen)

Code (glbasic) Select

// --------------------------------- //
// Project: Test_XOBJADDVERTEX
// Start: Friday, November 14, 2008
// IDE Version: 5.360

c = RGB(0, 255, 0)
d = RGB(0, 0, 255)


X_OBJSTART 0
X_OBJADDVERTEX -100,    0,    0,    0,  100, c
X_OBJADDVERTEX -100,  100,    0,    0,    0, c
X_OBJADDVERTEX  -50,    0,    0,   50,  100, c
X_OBJADDVERTEX  -50,  100,    0,   50,    0, c
X_OBJNEWGROUP
X_OBJADDVERTEX  -50,   80,    0,    0,   20, c
X_OBJADDVERTEX  -50,  100,    0,    0,    0, c
X_OBJADDVERTEX   50,   80,    0,  100,   20, c
X_OBJADDVERTEX   50,  100,    0,  100,    0, c
X_OBJNEWGROUP
X_OBJADDVERTEX   50,    0,    0,    0,  100, c
X_OBJADDVERTEX   50,  100,    0,    0,    0, c
X_OBJADDVERTEX  100,    0,    0,   50,  100, c
X_OBJADDVERTEX  100,  100,    0,   50,    0, c
X_OBJEND

X_OBJSTART 1
X_OBJADDVERTEX  -50,    0,    0,    0,   80, d
X_OBJADDVERTEX  -50,   80,    0,    0,    0, d
X_OBJADDVERTEX   50,    0,    0,  100,   80, d
X_OBJADDVERTEX   50,   80,    0,  100,    0, d
X_OBJEND


GLOBAL KEY_LEFT  = 203
GLOBAL KEY_RIGHT = 205
GLOBAL KEY_UP    = 200
GLOBAL KEY_DOWN  = 208
GLOBAL KEY_W     = 17
GLOBAL KEY_S     = 31

GLOBAL camx, camy, camz, camdx, camdy, camdz
GLOBAL angle, factor

camy = 50

camdx = 0
camdy = 50
camdz = 0

angle = 90
distance = 200


WHILE TRUE

IF KEY(KEY_LEFT)
DEC angle, 1
ENDIF
IF KEY(KEY_RIGHT)
INC angle, 1
ENDIF

IF KEY(KEY_W) THEN DEC distance, 3
IF KEY(KEY_S) THEN INC distance, 3

IF KEY(KEY_UP) THEN DEC camy, 5
IF KEY(KEY_DOWN) THEN INC camy, 5

camx = COS(angle) * distance
camz = SIN(angle) * distance

X_MAKE3D 1, 1000, 45
X_CAMERA camx, camy, camz, camdx, camdy, camdz
X_AMBIENT_LT 0, RGB(255, 255, 255)
X_DRAWAXES 0, 0, 0
X_DRAWOBJ 0, 0
X_DRAWOBJ 1, 0

SHOWSCREEN

WEND

Schranz0r

is ja komisch .....
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

#2
jau finde ich auch ;)
vor allem tritt der Effekt ja auch nicht immer auf. Wenn ich z.B. 2 Rechtecke gleich nebeneinander setze, tritt der Effekt nicht auf. Wenn ich jedoch wie hier ein Objekt quasi in ein bestehendes setze, wenn man so will, gibts die Lücke. Vielleicht sollte ich das mal mit den nativen OGL-Befehlen testen, ob es dann auch so aussieht.

Schranz0r

Ja teste das mal mit dem OpenGL Wrapper für GLBasic :)
schaut echt seltsam aus, kanns mir auch grad nich erklären :/
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Weil's 2 Objekte sind.
Oh dear. Ich werde das intern anders handhaben müssen. Das Problem ist, dass ich die Koordinaten auf "char" runterrechne (256), damit's beim Speichern kleiner wird.
Ich denke, dass ich das Dateiformat auch mal überholen sollte.

Quentin

ah, ok, dann ist die Fehlerursache also schon mehr oder minder bekannt.

Mit deinen gewrappten OpenGL-Befehlen klappt es allerdings auch vorzüglich. mit glNewList() kann man ja wie gewohnt seine Objekte erstellen und statt X_DRAWOBJ ruft man einfach glCallList() auf. Brauche ich mich also nicht sonderlich umzustellen

Hier noch mal das gleiche mit OpenGL-Befehlen. Die Texturangaben (glTexCoord2f) hätte ich hier natürlich nicht benötigt, hatte vorher aber ein wenig damit rumgespielt.

Code (glbasic) Select

// --------------------------------- //
// Project: TestOGL
// Start: Monday, November 17, 2008
// IDE Version: 5.360


glNewList(1, GL_COMPILE)
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS)
glTexCoord2f(   0,    0); glVertex3f(-100, 100, 0)
glTexCoord2f(   0, 1.00); glVertex3f(-100,   0, 0)
glTexCoord2f(0.50, 1.00); glVertex3f( -50,   0, 0)
glTexCoord2f(0.50,    0); glVertex3f( -50, 100, 0)
glEnd()
glBegin(GL_QUADS)
glTexCoord2f(   0,    0); glVertex3f( -50, 100, 0)
glTexCoord2f(   0, 0.20); glVertex3f( -50,  80, 0)
glTexCoord2f(1.00, 0.20); glVertex3f(  50,  80, 0)
glTexCoord2f(1.00,    0); glVertex3f(  50, 100, 0)
glEnd()
glBegin(GL_QUADS)
glTexCoord2f(   0,    0); glVertex3f(  50, 100, 0)
glTexCoord2f(   0, 1.00); glVertex3f(  50,   0, 0)
glTexCoord2f(0.50, 1.00); glVertex3f( 100,   0, 0)
glTexCoord2f(0.50,    0); glVertex3f( 100, 100, 0)
glEnd()

glEndList()

glNewList(2, GL_COMPILE)
glColor3f(0.0, 1.0, 0.0)
glBegin(GL_QUADS)
glTexCoord2f(   0,    0); glVertex3f( -50,  80, 0)
glTexCoord2f(   0, 0.80); glVertex3f( -50,   0, 0)
glTexCoord2f(1.00, 0.80); glVertex3f(  50,   0, 0)
glTexCoord2f(1.00,    0); glVertex3f(  50,  80, 0)
glEnd()
glEndList()



GLOBAL KEY_LEFT  = 203
GLOBAL KEY_RIGHT = 205
GLOBAL KEY_UP    = 200
GLOBAL KEY_DOWN  = 208
GLOBAL KEY_W     = 17
GLOBAL KEY_S     = 31

GLOBAL camx, camy, camz, camdx, camdy, camdz
GLOBAL angle, factor

camy = 50

camdx = 0
camdy = 50
camdz = 0

angle = 90
distance = 200


WHILE TRUE

IF KEY(KEY_LEFT)
DEC angle, 1
ENDIF
IF KEY(KEY_RIGHT)
INC angle, 1
ENDIF

IF KEY(KEY_W) THEN DEC distance, 3
IF KEY(KEY_S) THEN INC distance, 3

IF KEY(KEY_UP) THEN DEC camy, 5
IF KEY(KEY_DOWN) THEN INC camy, 5

camx = COS(angle) * distance
camz = SIN(angle) * distance

X_MAKE3D 1, 1000, 45
X_CAMERA camx, camy, camz, camdx, camdy, camdz
glCallList(1)
glCallList(2)
SHOWSCREEN

WEND



Dann ist mir noch aufgefallen, daß, wenn ich hier im Beispiel X_AMBIENT_LT verwende, die glColor3f - Aufrufe scheinbar keine Wirkung haben. Es wird dann immer blau aufgerufen anstatt der angegebenen Farbe. Gibt es für diesen Seiteneffekt auch eine Erklärung?

Kitty Hello

glEnable(GL_COLOR_MATERIAL) evtl?

Quentin

äh leider nicht, habe jetzt ein wenig mit glLight rumgefummelt und das geht auch ... zur Not.

Wirst du denn das Dateiformat in nächster Zeit überarbeiten oder steht das eher hinten in deiner Prio-Liste?

Hemlos

Gernot you told me not long ago this is opengl issue, dealing with 1 byte coordinates?
Bing ChatGpt is pretty smart :O