GLBasic forum

Codesnippets => Code Snippets => Topic started by: Kitty Hello on 2008-Feb-28

Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Kitty Hello on 2008-Feb-28
http://www.glbasic.com/showroom.php?lang=de&game=AC3DPoly

Endlich ein einfacher Weg um 2D Vectorgrafiken zu laden und nutzen.
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Schranz0r on 2008-Feb-28
Freak :D

Ist cool!
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: WPShadow on 2008-Feb-28
Genial!

Das schreit nach einem Test!
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Kitty Hello on 2008-Feb-28
OK, Update. Kollisionen gehen jetzt (auch mit Drehen + Strecken usw.)
Mann, ist das jetzt easy da ein Spiel zu machen. Wer hat Lust?
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: WPShadow on 2008-Feb-29
Ich mache ein Fun - Level in LR damit! hehehe

Das sieht sicher super aus...
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-01
wo gibt es ein freeewareprogramm um diese daten zu erzeugen?

mfg
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Tiuz on 2008-Mar-01
@ sechsrad
Gernot hat ja eine Readme dazugepackt, es gibt das Freewareprogramm "Blender" das *.ac3d Dateien exportieren kann. Außerdem kann man sich eine 14 Tage Testversion von "AC3D" runterladen.

Ein Frage an die AC3D Anwender: Was muss ich machen um eigene Texturen auf einem ac3d Modell auch in GLB zu sehen?
In die Datei einbinden? Extra laden? Oder geht das mit der Testversion nicht?

Grüße, Tiuz.
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-01
jup, danke.habe jetzt blender am laufen , funktioniert wunderbar mit den ac - dateien.
import und export !!!

QuoteAußerdem kann man sich eine 14 Tage Testversion von "AC3D" runterladen.
für unsere belange ein bisschen zu teuer.
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-01
gernot, mich würde jetzt mal interessieren, wie ich den drehpunkt verschieben kann vom poly , bzw wo wird der drehpunkt eigentlich aus der ac-datei ausglesen??

mfg
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Schranz0r on 2008-Mar-02
Antwort:

1.Keine Doppelposts machen!
2.Der Drehpunkt ist immer der 0,0,0 - Punkt aus deinem 3D-Model!
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Tiuz on 2008-Mar-02
Ist es möglich bei diesen 2D Vektorgrafiken eigene Texturen zu verwenden?

Grüße, Tiuz.
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-02
hier kann man den drehpunkt von dem gesamten vectorkörper x und y verlagern :
(auszug aus der dateibac3d.gbas)

px = pt.x*scalex +- wert
py = pt.y*scaley +- wert

Code (glbasic) Select
// ----------------------------------------
// Roto-Zoom-Stretch an AC3D shape
// ----------------------------------------
FUNCTION AC3D_RotoZoom: iShape, x, y, phi, scalex, scaley
LOCAL cphi = COS(phi)
LOCAL sphi = SIN(phi)
LOCAL px,py
LOCAL textur

FOREACH pol IN gAc3dModl[iShape].poly[]
ALPHAMODE pol.transparency
STARTPOLY 0
FOREACH pt IN pol.pts[]
px = pt.x*scalex
py = pt.y*scaley
POLYVECTOR x + px*cphi + py*sphi, y - px*sphi + py*cphi, 0,0,pol.color
NEXT
ENDPOLY
NEXT
ALPHAMODE 0
ENDFUNCTION
mfg
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Kitty Hello on 2008-Mar-03
Texturen mach' ich auch rein. Ist ja kein Thema. Fehlt aber noch.
Wenn Du einen anderen Drehpunkt haben willst, dann verschieb halt das Model in AC3D.
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-03
ich habe die datei mal geändert. es wird zu px und py der neue drehpunkt zugerechnet. dem enstprechend die funktionseingabe um diese 2 werte erweitert.
ich habe 2 ac-polyflächen, die mit einer drehpunktübergabe xdreh1,ydreh1 und xdreh2,ydreh2
funktionieren. dieser drehpunkt kann auch während des programmablaufes geändert werden für verschiedene spielanwendungen. es funktioniert auch die kollision.
nochmals ein lob an die erschaffer dieser polyfunktion.

bedienung vom beispiel mit den cursortasten , shift-l und shift-r.

ac3d-poly.gbas :

Code (glbasic) Select
AC3D_load("test1.ac", 0)

zoom1=0.2
zoom2=0.4

xdrehp1=50
ydrehp1=50

xdrehp2=0
ydrehp2=0

phi1=0
phi2=45

WHILE TRUE
    IF KEY(200) THEN my = my -3
IF KEY(208) THEN my = my +3
IF KEY(203) THEN mx = mx -3
IF KEY(205) THEN mx = mx +3

IF KEY(42) THEN INC phi1, 1
IF KEY(54) THEN DEC phi1, 1

DRAWRECT 0,0,320,240,RGB(0x80, 0x80, 0xff)

AC3D_RotoZoom(0, mx, my, phi1, zoom1,zoom1,xdrehp1,ydrehp1)

AC3D_RotoZoom(0, 100,100, phi2, zoom2,zoom2,xdrehp2,ydrehp2)

PRINT AC3D_Collision(0,mx,my,phi1,zoom1,zoom1,xdrehp1,ydrehp1, 0,100,100,phi2,zoom2,zoom2,xdrehp2,ydrehp2), 100,100

SHOWSCREEN
WEND
ac3d.gbas:

Code (glbasic) Select
TYPE Tac3d_point
x
y
ENDTYPE

TYPE Tac3d_poly
pts[] AS Tac3d_point
color
transparency
ENDTYPE

TYPE Tac3d_shape
poly[] AS Tac3d_poly
ENDTYPE

GLOBAL gAc3dModl[] AS Tac3d_shape

// ----------------------------------------
// Draw an AC3D shape
// ----------------------------------------
FUNCTION AC3D_Draw: iShape, x,y,xdrehp,ydrehp
AC3D_RotoZoom(iShape, x,y, 0, 1, 1,xdrehp,ydrehp)
ENDFUNCTION

// ----------------------------------------
// Roto-Zoom-Stretch an AC3D shape
// ----------------------------------------
FUNCTION AC3D_RotoZoom: iShape, x, y, phi, scalex, scaley,xdrehp,ydrehp
LOCAL cphi = COS(phi)
LOCAL sphi = SIN(phi)
LOCAL px,py
LOCAL textur

FOREACH pol IN gAc3dModl[iShape].poly[]
ALPHAMODE pol.transparency
STARTPOLY 0
FOREACH pt IN pol.pts[]
px = pt.x*scalex+xdrehp
py = pt.y*scaley+ydrehp
POLYVECTOR x + px*cphi + py*sphi, y - px*sphi + py*cphi, 0,0,pol.color
NEXT
ENDPOLY
NEXT
ALPHAMODE 0
ENDFUNCTION

// ----------------------------------------
// collision check
// ----------------------------------------
FUNCTION AC3D_Collision: id1,x1,y1,ph1,sx1,sy1,xdrehp1,ydrehp1, id2,x2,y2,ph2,sx2,sy2,xdrehp2,ydrehp2
LOCAL c1 = COS(ph1)
LOCAL s1 = SIN(ph1)
LOCAL c2 = COS(ph2)
LOCAL s2 = SIN(ph2)
LOCAL px, py
STATIC tri1[] AS Tac3d_point, tri2[] AS Tac3d_point
IF LEN(tri1[])=0
DIM tri1[3]
DIM tri2[3]
ENDIF

LOCAL i, j
FOREACH pol IN gAc3dModl[id1].poly[]
i=0
FOREACH pt IN pol.pts[]
px = pt.x*sx1+xdrehp1
py = pt.y*sy1+ydrehp1
tri1[i].x = x1 + px*c1 + py*s1
tri1[i].y = y1 - px*s1 + py*c1
INC i, 1
// got an outer triangle
IF i=3
// inner poly's triangles
FOREACH pol IN gAc3dModl[id2].poly[]
j=0
FOREACH pt IN pol.pts[]
px = pt.x*sx2+xdrehp2
py = pt.y*sy2+ydrehp2
tri2[j].x = x2 + px*c2 + py*s2
tri2[j].y = y2 - px*s2 + py*c2
INC j, 1
// got an inner triangle
IF j=3
IF AC3D_tricol(tri1[], tri2[])
IF 0
STARTPOLY -1
POLYVECTOR tri1[0].x, tri1[0].y,0,0,0x0000ff
POLYVECTOR tri1[1].x, tri1[1].y,0,0,0x0000ff
POLYVECTOR tri1[2].x, tri1[2].y,0,0,0x0000ff
ENDPOLY

STARTPOLY -1
POLYVECTOR tri2[0].x, tri2[0].y,0,0,0xff0000
POLYVECTOR tri2[1].x, tri2[1].y,0,0,0xff0000
POLYVECTOR tri2[2].x, tri2[2].y,0,0,0xff0000
ENDPOLY
ENDIF
RETURN TRUE
ENDIF

tri2[1]=tri2[2]
j=2
ENDIF
NEXT
NEXT

// end of inner work

tri1[1]=tri1[2]
i=2
ENDIF
NEXT
NEXT

ENDFUNCTION

// ----------------------------------------
// Intersect triangle with triangle
// ----------------------------------------
FUNCTION AC3D_tricol: tri1[] AS Tac3d_point, tri2[] AS Tac3d_point
LOCAL i
STATIC Edges[] AS Tac3d_point, N AS Tac3d_point
IF LEN(Edges[])=0 THEN DIM Edges[3]
Edges[0].x = tri1[1].x-tri1[0].x
Edges[0].y = tri1[1].y-tri1[0].y
Edges[1].x = tri1[2].x-tri1[1].x
Edges[1].y = tri1[2].y-tri1[1].y
Edges[2].x = tri1[0].x-tri1[2].x
Edges[2].y = tri1[0].y-tri1[2].y

FOR i=0 TO 2
N.x = -Edges[i].y; N.y = Edges[i].x
IF AC3D_AxisSeperatePolygons(N, tri1[], tri2[]) THEN RETURN FALSE
NEXT

Edges[0].x = tri2[1].x-tri2[0].x
Edges[0].y = tri2[1].y-tri2[0].y
Edges[1].x = tri2[2].x-tri2[1].x
Edges[1].y = tri2[2].y-tri2[1].y
Edges[2].x = tri2[0].x-tri2[2].x
Edges[2].y = tri2[0].y-tri2[2].y
FOR i=0 TO 2
N.x = -Edges[i].y; N.y = Edges[i].x
IF AC3D_AxisSeperatePolygons(N, tri1[], tri2[]) THEN RETURN FALSE
NEXT
RETURN TRUE
ENDFUNCTION

@FUNCTION AC3D_AxisSeperatePolygons: N AS Tac3d_point, t1[] AS Tac3d_point, t2[] AS Tac3d_point
LOCAL mina, maxa, minb, maxb
AC3D_CalculateInterval(N, t1[], mina, maxa)
AC3D_CalculateInterval(N, t2[], minb, maxb)

IF mina > maxb OR minb > maxa THEN RETURN TRUE
RETURN FALSE
ENDFUNCTION

@FUNCTION AC3D_CalculateInterval: N AS Tac3d_point, t1[] AS Tac3d_point, BYREF fmin, BYREF fmax
LOCAL d, i
d = t1[0].x*N.x + t1[0].y*N.y
fmin=fmax=d
FOR i=1 TO 2
d = t1[i].x*N.x + t1[i].y*N.y
IF d fmin=d
ELSE
IF d>fmax THEN fmax=d
ENDIF
NEXT
ENDFUNCTION

// ----------------------------------------
// Load an AC3D file
// ----------------------------------------
FUNCTION AC3D_load: filename$, iShape
IF OPENFILE(1, filename$, TRUE)=FALSE THEN RETURN FALSE

REDIM gAc3dModl[INTEGER(1+iShape/100)*100]
DIM gAc3dModl[iShape].poly[0]

LOCAL line$, i, n
LOCAL tok$[]
LOCAL pol AS Tac3d_poly
LOCAL loc[]
LOCAL valid_poly
LOCAL mat[] AS Tac3d_poly
LOCAL verts[] AS Tac3d_point
LOCAL poly_z
LOCAL z_for_poly[]
DIM loc[3]

WHILE ENDOFFILE(1) = FALSE
READLINE 1, line$
line$=LCASE$(line$)
IF SPLITSTR(line$, tok$[], " \t") = 0 THEN CONTINUE
DEBUG line$+"\n"


SELECT tok$[0]
// material - get the colour + transparency
CASE "material"
LOCAL m AS Tac3d_poly
m.color=RGB(255,255,255)
m.transparency = 0
FOR i=1 TO LEN(tok$[])-1
IF tok$[i]="rgb"
LOCAL r,g,b
r = tok$[i+1]
g = tok$[i+2]
b = tok$[i+3]
m.color=RGB(r*255, g*255, b*255)
INC i,3
ENDIF
IF tok$[i]="trans"
m.transparency = tok$[i+1]
IF m.transparency THEN m.transparency = -m.transparency
ENDIF
NEXT
DIMPUSH mat[], m

// new object
CASE "object"
// clear location
loc[0]=0; loc[1]=0; loc[2]=0
DIM verts[0]


valid_poly=FALSE
IF tok$[1] = "poly" THEN valid_poly=TRUE

// location
CASE "loc"
loc[0]=tok$[1]; loc[1]=tok$[2]; loc[2]=tok$[3]

// material
CASE "mat"
// assign material by copying mat[]-poly over current poly
pol = mat[tok$[1]]

// vertice positions
CASE "numvert"
IF valid_poly
LOCAL pt AS Tac3d_point
n = tok$[1]
FOR i=1 TO n
READLINE 1, line$
SPLITSTR(line$, tok$[], " \t")

pt.x = loc[0];   INC pt.x, tok$[0]
pt.y =-loc[1];   DEC pt.y, tok$[1]
poly_z=loc[2]; INC poly_z, tok$[2]

// Pre-Scale x 100, to fit AC3D scaling to pixels better
pt.x = pt.x*100
pt.y = pt.y*100

DIMPUSH verts[], pt
NEXT
ENDIF

// surface description
CASE "surf"
// #need: convert hex number 0x30 from tok$[1]
// The first 4 bits (flags & 0xF) is the type (0 = polygon, 1 = closedline, 2 = line).


// surface nodes
CASE "refs"
n = tok$[1]
FOR i=1 TO n
READLINE 1, line$ // index, u, v
DIMPUSH pol.pts[], verts[ line$ ] // first number in line$=index
NEXT

// reverse if not anti-clockwise
LOCAL i,j,num, area
num = BOUNDS(pol.pts[],0)

FOR i = 0 TO num-1
j=MOD(i+1,num)
DEC area, pol.pts[i].y * pol.pts[j].x
INC area, pol.pts[i].x * pol.pts[j].y
NEXT
// must flip
IF area > 0
LOCAL pts[] AS Tac3d_point
FOR i=num-1 TO 0 STEP -1
DIMPUSH pts[], pol.pts[i]
NEXT
pol.pts[] = pts[]
ENDIF


DIMPUSH gAc3dModl[iShape].poly[], pol
DIMPUSH z_for_poly[], poly_z
DIM pol.pts[0]
ENDSELECT
WEND

// sort polys by Z value
FOR i=0 TO LEN(gAc3dModl[iShape].poly[])-2
IF z_for_poly[i] > z_for_poly[i+1]
pol = gAc3dModl[iShape].poly[i]
gAc3dModl[iShape].poly[i  ] = gAc3dModl[iShape].poly[i+1]
gAc3dModl[iShape].poly[i+1] = pol
n = z_for_poly[i]
z_for_poly[i  ] = z_for_poly[i+1]
z_for_poly[i+1] = n
IF i>0 THEN DEC i, 2
ENDIF
NEXT

CLOSEFILE 1
RETURN TRUE
ENDFUNCTION
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Kitty Hello on 2008-Mar-05
Update!
Jetzt kann man in AC3D polylines machen, und die dann mit einem Sprite-"Stift" zeichnen lassen. Quasi wie bei GeometryWars oder so.
Ich flip' voll aus so cool ist das.
Kann bitte, bitte einer ein Spiel damit machen?
Bitte "Fort Apocalypse" in Stil von Saucelifter. :P
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Schranz0r on 2008-Mar-05
Jow ich guck mal :)
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-05
QuoteJetzt kann man in AC3D polylines machen, und die dann mit einem Sprite-"Stift" zeichnen lassen.
gut geworden, klasse.

bloss die sprite-stift-polygone sollten optisch geschlossen werden, weil die collision schon am geschlossenen aussenpolygon stattfindet. in einer sogenannten polygonschrere die nur aus 2 polylinien besteht mit einem gemeinsamen startpunkt oder einem offenen polygon , wird innen eine collision erkannt obwohl keine berührung stattfindet.

bei deinem zusätzlichen polygon zb kann man es gut erkennen mit der aussenliegenden collision.

mfg
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: BumbleBee on 2008-Mar-05
@sechsrad
Das heißt, du machst jetzt auch ein Spiel?

Cheers
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: Schranz0r on 2008-Mar-05
hehe der war gut :D

(http://www.orlyowl.com/upload/files/!NUB_LOL.jpg)
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-05
Code (glbasic) Select
Das heißt, du machst jetzt auch ein Spiel?so heute gehst weiter, war gestern auf der "cebit", tolle sachen was die so bieten!

wenn du das so siehst ja, für mein atmegaboard mit serieller anbindung und dem visuellen roboter mit glbasic.

ich versuch für meine visuale robotersteuerung eine genaue darstellung zu erzielen.
dazu passt dieses polygon-projekt ganz gut

die polygone die man zusätzlich zeichnen kann, kann ich als ultraschall-darstellung nehmen und wenn die auf ein objekt auftreffen wird dieses aufgenommen und über die serielle schnittstelle dem atmegaboard gesendet zum weiteren reagieren.
Title: 2D Vektorgrafiken mit AC3D Importer
Post by: sechsrad on 2008-Mar-07
QuoteDas heißt, du machst jetzt auch ein Spiel?
keine zeit, fange jetzt schon an zu sparen, das ich mir in 4 monaten den Pandora kaufen werde..freu! ich hoffe , das ihr mitziehen werdet und euch einen anschaffen werdet,damit die programmierscene heranwächs für den Pandora und nicht immer gesagt wird: ich programmiere zwar für den Pandora ,habe aber kein.

das heisst, ich werde nur meine roboterprojekte realisieren.

diese niedlichen handheld : gpx f200 und der Pandora sind doch klasse.

ein prosit auf die technik.