Forum | | | | Peter Mallow | Hallo, ich brauche mal wieder 3D-Berechnung.
Also mein Ziel ist es, ein 3-dimensionales Koordinatensystem mit Punkten auf dem 2-dimensionalen Bildschirm darzustellen. Klar könnte man sich es ganz einfach machen und genau so rangehen, wie man es auch auf ein Blatt Papier machen würde. z.B. 3 Einheitsvektoren, die auf den Koordinatenachsen liegen aufstellen und über eine Wegbeschreibung zu den Punkten gelangen: Vektor(X) = Einheitsvektor(X) * Px + Einheitsvektor(Y) * Py + Einheitsvektor(Y) * Py
Aber ich möchte es genauer machen. Ich möchte auch die Möglichkeit haben, das Koordinatensystem um alle Koordinatenachsen zu drehen, also den Beobachtungspunkt zu ändern.
Meine Überlegungen: Man könnte jeden Punkt auf eine Ebene projezieren, die genau orthogonal zum Beobachter ist: Durch den Beobachtungspunkt und den Koordinatenursprung könnte ich einen Vektor aufstellen, der Zugleich der Normalenvektor meiner Ebene ist. Dann könnte ich die Ebene erstellen, die z.B. durch den Koordinatenursprung läuft. Mit dem Normalenvektor kann ich dann für jeden Punkt eine Gerade aufstellen und anschließend den Schnittpunkt dieser Gerade mit der Ebene bestimmen. So bekomme ich jeden Punkt im Raum auf meine flache Ebene projeziert.
(Sind bis hierher meine Überlegungen richtig?)
Aber jetzt komme ich nicht weiter. Jetzt habe ich zwar alle Punkte auf einer Ebene, aber leider liegt diese Ebene immer noch irgendwo im Raum. Alle Punkte auf der Ebene haben noch 3 Koordinaten. Wie kann ich jetzt diese Ebene auf den Bildschirm projezieren? Bzw. wie kann ich die Koordinaten der Punkte auf der Ebene berechnen?
Btw.: ich habe Profan9 |
| | | WinXP Pro SP2, XProfan 9 + XPSE AMD Athlon 64 X2 3800 | 09.09.2007 ▲ |
| |
| | | Hm im Downloadcenter (unter den ZIPs) findest Du PSA-Zeugs, das ist ein Renderer von mir der genau dieses Prinzip nutzt um 3Dimensionale Flächen darzustellen. Der Renderer achtet aber zusätzlich auch auf die Flächen-Zeichen-Reihenfolge welche keinesfalls ausser Acht gelassen werden darf.
Im Prinzip nutzt ich KompilierenMarkierenSeparieren Schau Dir mal meine ersten damaligen Tests hierzu an: KompilierenMarkierenSeparieren {$cleq}
decimals 3
DEF Polygon(3) !GDI32,Polygon
declare tx1!,ty1!,tz1!,tx2!,ty2!,tz2!,tx3!,ty3!,tz3!,tx4!,ty4!,tz4!,tx5!,ty5!,tz5!,cx%,pg#,xd!,yd!,zd!needs engine
declare dist!,dist1!,dist2!,dist3!,distlb&mesh/vertex-distances
declare tmp1%,tmp2%,tmp3%,tmp4%,tmp5%,tmp6%,tmp7%,tmp8%,tmp9%,tmp10%,tmps$
declare vpx!,vpy!,vpz!,vpa!viewport
declare mx!,my!,_sense%needs engine
def !cam_w 1024
def !cam_h 0768
def !cam_fx 0512
def !cam_fy 0384
def !vpa 10
def 3dx(2) (((vpx!+@!(1)))/(vpz!+@!(2)))+!cam_fx
def 3dy(2) (((vpy!+@!(1)))/(vpz!+@!(2)))+!cam_fy
def 3dx(2) ((!vpa*(vpx!+@!(1)))/((vpz!+@!(2))/100))+!cam_fx
def 3dy(2) ((!vpa*(vpy!+@!(1)))/((vpz!+@!(2))/100))+!cam_fy
declare vtex_s% vertex-stack
declare vtex_x![250]
declare vtex_y![250]
declare vtex_z![250]
declare mesh_s%
declare meshs_f%
declare mesh%[250,4]
declare obj_s% object-stack
declare object%[100,2] object-stack
declare scene_s% scenerende-vertexstack
destroywindow(main(init_engine()))
end
proc main
if @%(1)
if init_objects()
Dim Pg#,50
mcls 1024,768
startpaint -1
textcolor 0,-1
endpaint
vpz!:=300
while _sense%
cls
case %mousepressed=1 : vpz!=vpz!-5
case %mousepressed=2 : vpz!=vpz!+5
mx!=%mousex-!cam_fx
my!=%mousey-!cam_fy
vpx!=mx!
vpy!=my!
vpy!=my!
startpaint -1
cls
usebrush 1,rgb(255,0,0)
if draw_scene(calc_scene())
endif
endpaint
showwindow(distlb&,0)
mcopybmp 0,0 - 1024,768 > 0,0;0
showwindow(distlb&,1)
getmessage
case equ(%scankey,65) : dec _sense%
wend
dispose pg#
endif
return %hwnd
endif
return %hinstance
endproc
proc calc_scene
cx%=0
sendmessage(distlb&,$0184,0,0)
meshs_f%=0
while cx%<mesh_s%
inc cx%
if calc_mesh(cx%)
endif
wend
endproc
proc draw_scene
locate 1,1
cx%=0
while cx%<meshs_f%
inc cx%
if draw_mesh(val(substr$(getstring$(distlb&,meshs_f%-cx%),2, )))
endif
wend
endproc
proc calc_mesh
tx5!=vpx!
ty5!=vpy!
tz5!=vpz!
tx1!=(vtex_x![mesh%[@%(1),1]])
tx2!=(vtex_x![mesh%[@%(1),2]])
tx3!=(vtex_x![mesh%[@%(1),3]])
tx4!=(vtex_x![mesh%[@%(1),4]])
ty1!=(vtex_y![mesh%[@%(1),1]])
ty2!=(vtex_y![mesh%[@%(1),2]])
ty3!=(vtex_y![mesh%[@%(1),3]])
ty4!=(vtex_y![mesh%[@%(1),4]])
tz1!=abs(vtex_z![mesh%[@%(1),1]])
tz2!=abs(vtex_z![mesh%[@%(1),2]])
tz3!=abs(vtex_z![mesh%[@%(1),3]])
tz4!=abs(vtex_z![mesh%[@%(1),4]])
xd! = abs((tx4!+tx1!+tx2!+tx3!)/4+vpx! ) /2
yd! = abs((ty4!+ty1!+ty2!+ty3!)/4+vpy! ) /2
zd! = abs((tz4!+tz1!+tz2!+tz3!)/4+vpz!/7 ) /2
dist!= sqrt(xd!*xd! + yd!*yd! + zd!*zd!)
if dist!<99
if dist!>=10
inc meshs_f%
tmps$=str$(dist!)+ +str$(@%(1))+ +str$(xd!)+ +str$(yd!)+ +str$(zd!)
sendmessage (distlb&,$180,0,addr(tmps$))
elseif dist!>=1
inc meshs_f%
tmps$=0+str$(dist!)+ +str$(@%(1))+ +str$(xd!)+ +str$(yd!)+ +str$(zd!)
sendmessage (distlb&,$180,0,addr(tmps$))
endif
endif
endproc
proc draw_mesh
tx1!=vtex_x![mesh%[@%(1),1]]
ty1!=vtex_y![mesh%[@%(1),1]]
tz1!=vtex_z![mesh%[@%(1),1]]
tx2!=vtex_x![mesh%[@%(1),2]]
ty2!=vtex_y![mesh%[@%(1),2]]
tz2!=vtex_z![mesh%[@%(1),2]]
tx3!=vtex_x![mesh%[@%(1),3]]
ty3!=vtex_y![mesh%[@%(1),3]]
tz3!=vtex_z![mesh%[@%(1),3]]
tx4!=vtex_x![mesh%[@%(1),4]]
ty4!=vtex_y![mesh%[@%(1),4]]
tz4!=vtex_z![mesh%[@%(1),4]]
tmp1%=3dx(tx1!,tz1!)
tmp2%=3dy(ty1!,tz1!)
tmp3%=3dx(tx2!,tz2!)
tmp4%=3dy(ty2!,tz2!)
tmp5%=3dx(tx3!,tz3!)
tmp6%=3dy(ty3!,tz3!)
tmp7%=3dx(tx4!,tz4!)
tmp8%=3dy(ty4!,tz4!)
if drawpoly( tmp1%,tmp2% , tmp3%,tmp4% , tmp5%,tmp6% ,tmp7%,tmp8% )
endif
endproc
proc draw_mesh_nr
tx1!=vtex_x![mesh%[@%(1),1]]
ty1!=vtex_y![mesh%[@%(1),1]]
tz1!=vtex_z![mesh%[@%(1),1]]
tx2!=vtex_x![mesh%[@%(1),2]]
ty2!=vtex_y![mesh%[@%(1),2]]
tz2!=vtex_z![mesh%[@%(1),2]]
tx3!=vtex_x![mesh%[@%(1),3]]
ty3!=vtex_y![mesh%[@%(1),3]]
tz3!=vtex_z![mesh%[@%(1),3]]
setpixel 3dx((tx1!+tx2!+tx3!)/3,(tz1!+tz2!+tz3!)/3),3dy((ty1!+ty2!+ty3!)/3,(tz1!+tz2!+tz3!)/3),0
drawtext 3dx((tx1!+tx2!+tx3!)/3,(tz1!+tz2!+tz3!)/3),3dy((ty1!+ty2!+ty3!)/3,(tz1!+tz2!+tz3!)/3) ,str$(@%(1))
endproc
proc init_objects
if push_3d_box (-100,-25,.1 , -50,25,50)
if push_3d_box (50,-25,.1 , 100,25,50)
if push_3d_box (5,5,5 , 50,50,50)
return obj_s%
endif
endif
endif
return 0
endproc
proc init_engine
return init_mainWindow(clear_3d_stacks())
endproc
proc init_mainWindow
if @%(1)
windowstyle 80
window 0,0 - 1024,768
distlb&=createsortedlistbox(%hwnd,,0,0,180,50)
setfont distlb&,createfont (Small Fonts,8,0,0,0,0)
showwindow(distlb&,0)
return %hwnd
endif
return 0
endproc
proc push_3d_box
parameters x!,y!,z!,xt!,yt!,zt!
inc obj_s%
tmp1%=push_vertex(x!,y!,z!)
tmp2%=push_vertex(xt!,y!,z!)
tmp3%=push_vertex(xt!,y!,zt!)
tmp4%=push_vertex(x!,y!,zt!)
tmp5%=push_vertex(x!,yt!,z!)
tmp6%=push_vertex(xt!,yt!,z!)
tmp7%=push_vertex(xt!,yt!,zt!)
tmp8%=push_vertex(x!,yt!,zt!)
if push_mesh(tmp1%,tmp2%,tmp3%,tmp4%)1 top
if push_mesh(tmp5%,tmp6%,tmp7%,tmp8%)2 bottom
if push_mesh(tmp4%,tmp3%,tmp7%,tmp8%)2 back
if push_mesh(tmp1%,tmp2%,tmp6%,tmp5%)2 front
if push_mesh(tmp1%,tmp4%,tmp8%,tmp5%)2 left
if push_mesh(tmp2%,tmp3%,tmp7%,tmp6%)2 right
endif
endif
endif
endif
endif
endif
return obj_s%
endproc
proc push_mesh(vtexn1,vtexn2,vtexn3)
parameters vtexn1%,vtexn2%,vtexn3%,vtexn4%
inc mesh_s%
mesh%[mesh_s%,1]=vtexn1%
mesh%[mesh_s%,2]=vtexn2%
mesh%[mesh_s%,3]=vtexn3%
mesh%[mesh_s%,4]=vtexn4%
return mesh_s%
endproc
proc clear_3d_stacks()
_sense%=1
vpx!=0
vpy!=0
vpz!=0
vpa!=1
clear vtex_z![]
clear vtex_y![]
clear vtex_x![]
vtex_s%=0
obj_s%=0
mesh_s%=0
return 1
endproc
proc push_vertex(x!,y!,z!)
parameters x!,y!,z!
inc vtex_s%
vtex_x![vtex_s%]=x!
vtex_y![vtex_s%]=y!
vtex_z![vtex_s%]=z!
return vtex_s%
endproc
Proc DrawPoly
Parameters X%,y%,xx%,yy%,xxx%,yyy%,xxxx%,yyyy%
Long pg#,0 = x%
Long pg#,4 = y%
Long pg#,8 = xx%
Long pg#,12= yy%
Long pg#,16= xxx%
Long pg#,20= yyy% Long pg#,24= xxxx%
Long pg#,24= xxxx%
Long pg#,28= yyyy%
Polygon (%hdc,pg#,4)
Endproc
tx1!=3dx(x!,z!)
tx2!=3dx(xt!,z!)
tx3!=3dx(x!,zt!)
tx4!=3dx(xt!,zt!)
ty1!=3dy(y!,z!)
ty2!=3dy(yt!,z!)
ty3!=3dy(y!,zt!)
ty4!=3dy(yt!,zt!)
line tx1!,ty1! - tx2!,ty1!
line tx1!,ty1! - tx1!,ty2!
line tx1!,ty2! - tx2!,ty2!
line tx2!,ty1! - tx2!,ty2!
line tx3!,ty3! - tx4!,ty3!
line tx3!,ty3! - tx3!,ty4!
line tx3!,ty4! - tx4!,ty4!
line tx4!,ty3! - tx4!,ty4!
line tx1!,ty1! - tx3!,ty3!
line tx2!,ty2! - tx4!,ty4!
line tx1!,ty2! - tx3!,ty4!
line tx2!,ty1! - tx4!,ty3!
proc 3d_lin
parameters x1!,y1!,z1!,x2!,y2!,z2!
line 3dx(x1!,z1!),3dy(y1!,z1!) - 3dx(x2!,z2!),3dy(y2!,z2!)
endproc
KompilierenMarkierenSeparieren {$cleq}
$P*
$I mouse.inc
decimals 5
DEF Polygon(3) !GDI32,Polygon
declare tx1!,ty1!,tz1!,tx2!,ty2!,tz2!,tx3!,ty3!,tz3!,tx4!,ty4!,tz4!,tx5!,ty5!,tz5!,cx%,pg#,xd!,yd!,zd!needs engine
declare dist!,dist1!,dist2!,dist3!,distlb&mesh/vertex-distances
declare tmp1%,tmp2%,tmp3%,tmp4%,tmp5%,tmp6%,tmp7%,tmp8%,tmp9%,tmp10%,tmps$
declare vpx!,vpy!,vpz!,vpa!,vprx!,vpry!,vprz!viewport
declare fps&,efps&,tm&
declare mx!,my!,_sense%needs engine
def !cam_w 1024
def !cam_h 0768
def !cam_fx 0512
def !cam_fy 0384
def !vpa 10
def 3dx(2) (((vpx!+@!(1)))/(vpz!+@!(2)))+!cam_fx
def 3dy(2) (((vpy!+@!(1)))/(vpz!+@!(2)))+!cam_fy
def 3dx(2) ((!vpa*(vpx!+@!(1)))/((vpz!+@!(2))/100))+!cam_fx
def 3dy(2) ((!vpa*(vpy!+@!(1)))/((vpz!+@!(2))/100))+!cam_fy
def 3dx(2) ( ((!vpa*(vpx!+@!(1)))/((vpz!+@!(2))/100)) * cos(vprx!) + @!(2)*sin(vprx!)) +!cam_fx
def 3dy(2) ( ((!vpa*(vpy!+@!(1)))/((vpz!+@!(2))/100)) ) +!cam_fy
def 3dx(2) ((!vpa*(vpx!+@!(1)))/((vpz!+@!(2))/100))+!cam_fx
def 3dy(2) ((!vpa*(vpy!+@!(1)))/((vpz!+@!(2))/100))+!cam_fy
x´ = x * cos (a) + z * sin (a)
z´ = - x * sin (a) + z * cos (a)
declare vtex_s% vertex-stack
declare vtex_x![250]
declare vtex_y![250]
declare vtex_z![250]
declare mesh_s%
declare meshs_f%
declare mesh%[250,4]
declare obj_s% object-stack
declare object%[100,2] object-stack
declare scene_s% scenerende-vertexstack
destroywindow(main(init_engine()))
end
proc main
if @%(1)
if init_objects()
Dim Pg#,50
mcls 1024,768
startpaint -1
usefont MS Sans Serif,14,0,0,0,0
textcolor rgb(255,255,255),-1
endpaint
while _sense%
cls
fps.cnt.eng
case %mousepressed=1 : vpz!=vpz!-4
case %mousepressed=2 : vpz!=vpz!+4
mx!=%mousex-!cam_fx
my!=%mousey-!cam_fy
vpx!=mx!/5
vpy!=my!/5
vpy!=my!
startpaint -1
cls 0
usepen 0,1,rgb(192,0,0)
usebrush 1,rgb(255,0,0)
if draw_scene(calc_scene())
endif
drawtext 0,755,iF, +str$(efps&)+ fps
endpaint
showwindow(distlb&,0)
mcopybmp 0,0 - 1024,768 > 0,0;0
showwindow(distlb&,1)
getmessage
case equ(%scankey,65) : dec _sense%
if 1equ(%scankey,66)
whileloop 8
rotatevertex &loop,0.009,0
wend
whileloop 9,16,1
rotatevertex &loop,-0.050,0
wend
endif
wend
dispose pg#
endif
return %hwnd
endif
return %hinstance
endproc
proc fps.cnt.eng
fps&=fps&+1
if (&gettickcount>tm&)
efps&=fps&
tm&=tm&+1000
fps&=0
endif
endproc
proc rotatevertex
parameters vn%,xr!,yr!,zr!
declare vx!,vz!,vy!
vx!=vtex_x![vn%]
vy!=vtex_y![vn%]
vz!=vtex_z![vn%]
vtex_x![vn%]=vx!*cos(xr!) + vz!*sin(xr!)
vtex_z![vn%]=(vx!*-1)*sin(xr!) + vz!*cos(xr!)
x´ = x * cos (a) + z * sin (a)
z´ = - x * sin (a) + z * cos (a)
endproc
proc calc_scene
cx%=0
sendmessage(distlb&,$0184,0,0)
meshs_f%=0
while cx%<mesh_s%
inc cx%
if calc_mesh(cx%)
endif
wend
endproc
proc draw_scene
locate 1,1
cx%=0
while cx%<meshs_f%
inc cx%
if draw_mesh(val(substr$(getstring$(distlb&,meshs_f%-cx%),2, )))
endif
wend
endproc
proc calc_mesh
tx5!=vpx!
ty5!=vpy!
tz5!=vpz!
tx1!=(vtex_x![mesh%[@%(1),1]])
tx2!=(vtex_x![mesh%[@%(1),2]])
tx3!=(vtex_x![mesh%[@%(1),3]])
tx4!=(vtex_x![mesh%[@%(1),4]])
ty1!=(vtex_y![mesh%[@%(1),1]])
ty2!=(vtex_y![mesh%[@%(1),2]])
ty3!=(vtex_y![mesh%[@%(1),3]])
ty4!=(vtex_y![mesh%[@%(1),4]])
tz1!=(vtex_z![mesh%[@%(1),1]])
tz2!=(vtex_z![mesh%[@%(1),2]])
tz3!=(vtex_z![mesh%[@%(1),3]])
tz4!=(vtex_z![mesh%[@%(1),4]])
xd! = ((tx4!+tx1!+tx2!+tx3!)/4+vpx! ) /2
yd! = ((ty4!+ty1!+ty2!+ty3!)/4+vpy! ) /2
zd! = ((tz4!+tz1!+tz2!+tz3!)/4+vpz! ) /2
dist!= sqrt(xd!*xd! + yd!*yd! + zd!*zd!) /8
if dist!<99
if dist!>=10
inc meshs_f%
tmps$=str$(dist!)+ +str$(@%(1))+ +str$(xd!)+ +str$(yd!)+ +str$(zd!)
sendmessage (distlb&,$180,0,addr(tmps$))
elseif dist!>=1
inc meshs_f%
tmps$=0+str$(dist!)+ +str$(@%(1))+ +str$(xd!)+ +str$(yd!)+ +str$(zd!)
sendmessage (distlb&,$180,0,addr(tmps$))
endif
endif
endproc
proc draw_mesh
tx1!=vtex_x![mesh%[@%(1),1]]
ty1!=vtex_y![mesh%[@%(1),1]]
tz1!=vtex_z![mesh%[@%(1),1]]
tx2!=vtex_x![mesh%[@%(1),2]]
ty2!=vtex_y![mesh%[@%(1),2]]
tz2!=vtex_z![mesh%[@%(1),2]]
tx3!=vtex_x![mesh%[@%(1),3]]
ty3!=vtex_y![mesh%[@%(1),3]]
tz3!=vtex_z![mesh%[@%(1),3]]
tx4!=vtex_x![mesh%[@%(1),4]]
ty4!=vtex_y![mesh%[@%(1),4]]
tz4!=vtex_z![mesh%[@%(1),4]]
tmp1%=3dx(tx1!,tz1!)
tmp2%=3dy(ty1!,tz1!)
tmp3%=3dx(tx2!,tz2!)
tmp4%=3dy(ty2!,tz2!)
tmp5%=3dx(tx3!,tz3!)
tmp6%=3dy(ty3!,tz3!)
tmp7%=3dx(tx4!,tz4!)
tmp8%=3dy(ty4!,tz4!)
if drawpoly( tmp1%,tmp2% , tmp3%,tmp4% , tmp5%,tmp6% ,tmp7%,tmp8% )
endif
endproc
proc init_objects
if push_3d_box (-25,-25,-25 , 25,25,25)
if push_3d_box (-10,-10,-10 , 10,10,10)
if push_3d_box (-100,-25,.1 , -50,25,50)
if push_3d_box (50,-25,.1 , 100,25,50)
return obj_s%
endif
endif
endif
return 0
endproc
proc init_engine
return init_mainWindow(clear_3d_stacks())
endproc
proc init_mainWindow
if @%(1)
windowstyle 80
window 0,0 - 1024,768
distlb&=createsortedlistbox(%hwnd,,0,0,180,50)
setfont distlb&,createfont (Small Fonts,8,0,0,0,0)
showwindow(distlb&,0)
return %hwnd
endif
return 0
endproc
proc push_3d_box
parameters x!,y!,z!,xt!,yt!,zt!
inc obj_s%
tmp1%=push_vertex(x!,y!,z!)
tmp2%=push_vertex(xt!,y!,z!)
tmp3%=push_vertex(xt!,y!,zt!)
tmp4%=push_vertex(x!,y!,zt!)
tmp5%=push_vertex(x!,yt!,z!)
tmp6%=push_vertex(xt!,yt!,z!)
tmp7%=push_vertex(xt!,yt!,zt!)
tmp8%=push_vertex(x!,yt!,zt!)
if push_mesh(tmp1%,tmp2%,tmp3%,tmp4%)1 top
if push_mesh(tmp5%,tmp6%,tmp7%,tmp8%)2 bottom
if push_mesh(tmp4%,tmp3%,tmp7%,tmp8%)2 back
if push_mesh(tmp1%,tmp2%,tmp6%,tmp5%)2 front
if push_mesh(tmp1%,tmp4%,tmp8%,tmp5%)2 left
if push_mesh(tmp2%,tmp3%,tmp7%,tmp6%)2 right
endif
endif
endif
endif
endif
endif
return obj_s%
endproc
proc push_mesh(vtexn1,vtexn2,vtexn3)
parameters vtexn1%,vtexn2%,vtexn3%,vtexn4%
inc mesh_s%
mesh%[mesh_s%,1]=vtexn1%
mesh%[mesh_s%,2]=vtexn2%
mesh%[mesh_s%,3]=vtexn3%
mesh%[mesh_s%,4]=vtexn4%
return mesh_s%
endproc
proc clear_3d_stacks()
_sense%=1
vpx!=0
vpy!=0
vpz!=-200
vpa!=1
vprx!=0
vpry!=0
vprz!=0
clear vtex_z![]
clear vtex_y![]
clear vtex_x![]
vtex_s%=0
obj_s%=0
mesh_s%=0
efps&=0
fps&=0
tm&=&gettickcount
return 1
endproc
proc push_vertex(x!,y!,z!)
parameters x!,y!,z!
inc vtex_s%
vtex_x![vtex_s%]=x!
vtex_y![vtex_s%]=y!
vtex_z![vtex_s%]=z!
return vtex_s%
endproc
Proc DrawPoly
Parameters X%,y%,xx%,yy%,xxx%,yyy%,xxxx%,yyyy%
Long pg#,0 = x%
Long pg#,4 = y%
Long pg#,8 = xx%
Long pg#,12= yy%
Long pg#,16= xxx%
Long pg#,20= yyy% Long pg#,24= xxxx%
Long pg#,24= xxxx%
Long pg#,28= yyyy%
Polygon (%hdc,pg#,4)
Endproc
tx1!=3dx(x!,z!)
tx2!=3dx(xt!,z!)
tx3!=3dx(x!,zt!)
tx4!=3dx(xt!,zt!)
ty1!=3dy(y!,z!)
ty2!=3dy(yt!,z!)
ty3!=3dy(y!,zt!)
ty4!=3dy(yt!,zt!)
line tx1!,ty1! - tx2!,ty1!
line tx1!,ty1! - tx1!,ty2!
line tx1!,ty2! - tx2!,ty2!
line tx2!,ty1! - tx2!,ty2!
line tx3!,ty3! - tx4!,ty3!
line tx3!,ty3! - tx3!,ty4!
line tx3!,ty4! - tx4!,ty4!
line tx4!,ty3! - tx4!,ty4!
line tx1!,ty1! - tx3!,ty3!
line tx2!,ty2! - tx4!,ty4!
line tx1!,ty2! - tx3!,ty4!
line tx2!,ty1! - tx4!,ty3!
proc 3d_lin
parameters x1!,y1!,z1!,x2!,y2!,z2!
line 3dx(x1!,z1!),3dy(y1!,z1!) - 3dx(x2!,z2!),3dy(y2!,z2!)
endproc
KompilierenMarkierenSeparieren {$cleq}
$P*
DEF Polygon(3) !GDI32,Polygon
declare tx1!,ty1!,tz1!,tx2!,ty2!,tz2!,tx3!,ty3!,tz3!,tx4!,ty4!,tz4!,tx5!,ty5!,tz5!,cx%,pg#,xd!,yd!,zd!needs engine
declare dist!,dist1!,dist2!,dist3!,distlb&mesh/vertex-distances
declare tmp1%,tmp2%,tmp3%,tmp4%,tmp5%,tmp6%,tmp7%,tmp8%,tmp9%,tmp10%,tmps$
declare vpx!,vpy!,vpz!,vpa!,vprx!,vpry!,vprz!viewport
declare fps&,efps&,tm&
declare mx!,my!,_sense%needs engine
declare box1%
def !cam_w 320
def !cam_h 0200
def !cam_fx 160
def !cam_fy 100
def !vpa 10
def 3dx(2) ((!vpa*(vpx!+@!(1)))/((vpz!+@!(2))/015))+!cam_fx
def 3dy(2) ((!vpa*(vpy!+@!(1)))/((vpz!+@!(2))/015))+!cam_fy
declare vtex_s% vertex-stack
declare vtex_x![250]
declare vtex_y![250]
declare vtex_z![250]
declare mesh_s%
declare meshs_f%
declare mesh%[250,4]
declare obj_s% object-stack
declare object%[100,2] object-stack
declare scene_s% scenerende-vertexstack
destroywindow(main(init_engine()))
end
proc main
if @%(1)
if init_objects()
Dim Pg#,50
mcls 320,200
startpaint -1
usefont MS Sans Serif,14,0,0,0,0
textcolor rgb(255,255,255),-1
endpaint
vpz!:=25
mx!:=6
my!:=10
while _sense%
cls
vpx!=mx!/5
vpy!=my!/5
vpy!=my!
startpaint -1
cls 0
usepen 0,1,rgb(192,0,0)
usebrush 1,rgb(255,0,0)
if draw_scene(calc_scene())
endif
drawtext 10,10,iFs lil 3D
endpaint
showwindow(distlb&,0)
mcopybmp 0,0 - 320,200 > 0,0;0
showwindow(distlb&,1)
getmessage
case equ(%scankey,65) : dec _sense%
locate 1,1
print %scankey<37>39^38|40
if 1equ(%scankey,66)
rotateobject box1%,mx!/1000,my!/1000,0
endif
wend
dispose pg#
endif
return %hwnd
endif
return %hinstance
endproc
proc rotateobject
parameters obn%,x!,y!,z!
whileloop object%[obn%,1],object%[obn%,2],1
rotatevertex &loop,x!,y!,z!
wend
endproc
proc fps.cnt.eng
fps&=fps&+1
if (&gettickcount>tm&)
efps&=fps&
tm&=tm&+1000
fps&=0
endif
endproc
proc rotatevertex
parameters vn%,xr!,yr!,zr!
declare vx!,vz!,vy!
ifnot xr!=0
vx!=vtex_x![vn%]
vy!=vtex_y![vn%]
vz!=vtex_z![vn%]
vtex_x![vn%]=vx!*cos(xr!) + vz!*sin(xr!)
vtex_z![vn%]=(vx!*-1)*sin(xr!) + vz!*cos(xr!)
endif
ifnot yr!=0
vx!=vtex_x![vn%]
vy!=vtex_y![vn%]
vz!=vtex_z![vn%]
vtex_y![vn%]=vy!*cos(yr!) + vz!*sin(yr!)
vtex_z![vn%]=(vy!*-1)*sin(yr!) + vz!*cos(yr!)
endif
ifnot zr!=0
vx!=vtex_x![vn%]
vy!=vtex_y![vn%]
vz!=vtex_z![vn%]
vtex_x![vn%]=vx!*cos(zr!)-vy!*sin(zr!)
vtex_y![vn%]=vx!*sin(zr!)+vy!*cos(zr!)
endif
endproc
proc calc_scene
cx%=0
sendmessage(distlb&,$0184,0,0)
meshs_f%=0
while cx%<mesh_s%
inc cx%
if calc_mesh(cx%)
endif
wend
endproc
proc draw_scene
locate 1,1
cx%=0
while cx%<meshs_f%
inc cx%
if draw_mesh(val(substr$(getstring$(distlb&,meshs_f%-cx%),2, )))
endif
wend
endproc
proc calc_mesh
tx5!=vpx!
ty5!=vpy!
tz5!=vpz!
tx1!=(vtex_x![mesh%[@%(1),1]])
tx2!=(vtex_x![mesh%[@%(1),2]])
tx3!=(vtex_x![mesh%[@%(1),3]])
tx4!=(vtex_x![mesh%[@%(1),4]])
ty1!=(vtex_y![mesh%[@%(1),1]])
ty2!=(vtex_y![mesh%[@%(1),2]])
ty3!=(vtex_y![mesh%[@%(1),3]])
ty4!=(vtex_y![mesh%[@%(1),4]])
tz1!=(vtex_z![mesh%[@%(1),1]])
tz2!=(vtex_z![mesh%[@%(1),2]])
tz3!=(vtex_z![mesh%[@%(1),3]])
tz4!=(vtex_z![mesh%[@%(1),4]])
xd! = ((tx4!+tx1!+tx2!+tx3!)/4+vpx! ) /2
yd! = ((ty4!+ty1!+ty2!+ty3!)/4+vpy! ) /2
zd! = ((tz4!+tz1!+tz2!+tz3!)/4+vpz! ) /2
dist!= sqrt(xd!*xd! + yd!*yd! + zd!*zd!) /8
if dist!<99
if dist!>=10
inc meshs_f%
tmps$=str$(dist!)+ +str$(@%(1))+ +str$(xd!)+ +str$(yd!)+ +str$(zd!)
sendmessage (distlb&,$180,0,addr(tmps$))
elseif dist!>=1
inc meshs_f%
tmps$=0+str$(dist!)+ +str$(@%(1))+ +str$(xd!)+ +str$(yd!)+ +str$(zd!)
sendmessage (distlb&,$180,0,addr(tmps$))
endif
endif
endproc
proc draw_mesh
tx1!=vtex_x![mesh%[@%(1),1]]
ty1!=vtex_y![mesh%[@%(1),1]]
tz1!=vtex_z![mesh%[@%(1),1]]
tx2!=vtex_x![mesh%[@%(1),2]]
ty2!=vtex_y![mesh%[@%(1),2]]
tz2!=vtex_z![mesh%[@%(1),2]]
tx3!=vtex_x![mesh%[@%(1),3]]
ty3!=vtex_y![mesh%[@%(1),3]]
tz3!=vtex_z![mesh%[@%(1),3]]
tx4!=vtex_x![mesh%[@%(1),4]]
ty4!=vtex_y![mesh%[@%(1),4]]
tz4!=vtex_z![mesh%[@%(1),4]]
drawpoly 3dx(tx1!,tz1!),3dy(ty1!,tz1!) , 3dx(tx2!,tz2!),3dy(ty2!,tz2!) , 3dx(tx3!,tz3!),3dy(ty3!,tz3!) ,3dx(tx4!,tz4!),3dy(ty4!,tz4!)
endproc
proc init_objects
box1%=push_3d_box (-7,-7,-7 , 7,7,7)
return obj_s%
endproc
proc init_engine
return init_mainWindow(clear_3d_stacks())
endproc
proc init_mainWindow
if @%(1)
windowstyle 80
window 0,0 - 320,200
distlb&=createsortedlistbox(%hwnd,,0,0,180,50)
setfont distlb&,createfont (Small Fonts,8,0,0,0,0)
showwindow(distlb&,0)
return %hwnd
endif
return 0
endproc
proc beginobject
inc obj_s%
object%[obj_s%,1]=vtex_s%+1
return 1
endproc
proc endobject
object%[obj_s%,2]=vtex_s%
return obj_s%
endproc
proc push_3d_box
parameters x!,y!,z!,xt!,yt!,zt!
beginobject
tmp1%=push_vertex(x!,y!,z!)
tmp2%=push_vertex(xt!,y!,z!)
tmp3%=push_vertex(xt!,y!,zt!)
tmp4%=push_vertex(x!,y!,zt!)
tmp5%=push_vertex(x!,yt!,z!)
tmp6%=push_vertex(xt!,yt!,z!)
tmp7%=push_vertex(xt!,yt!,zt!)
tmp8%=push_vertex(x!,yt!,zt!)
return endobject(push_mesh(tmp1%,tmp2%,tmp3%,tmp4%),push_mesh (tmp5%,tmp6%,tmp7%,tmp8%),push_mesh (tmp4%,tmp3%,tmp7%,tmp8%),push_mesh (tmp1%,tmp2%,tmp6%,tmp5%),push_mesh (tmp1%,tmp4%,tmp8%,tmp5%),push_mesh (tmp2%,tmp3%,tmp7%,tmp6%))
endproc
proc push_mesh(vtexn1,vtexn2,vtexn3)
parameters vtexn1%,vtexn2%,vtexn3%,vtexn4%
inc mesh_s%
mesh%[mesh_s%,1]=vtexn1%
mesh%[mesh_s%,2]=vtexn2%
mesh%[mesh_s%,3]=vtexn3%
mesh%[mesh_s%,4]=vtexn4%
return mesh_s%
endproc
proc clear_3d_stacks()
_sense%=1
vpx!=0
vpy!=0
vpz!=-200
vpa!=1
vprx!=0
vpry!=0
vprz!=0
clear vtex_z![]
clear vtex_y![]
clear vtex_x![]
vtex_s%=0
obj_s%=0
mesh_s%=0
efps&=0
fps&=0
tm&=&gettickcount
return 1
endproc
proc push_vertex(x!,y!,z!)
parameters x!,y!,z!
inc vtex_s%
vtex_x![vtex_s%]=x!
vtex_y![vtex_s%]=y!
vtex_z![vtex_s%]=z!
return vtex_s%
endproc
Proc DrawPoly
Parameters X%,y%,xx%,yy%,xxx%,yyy%,xxxx%,yyyy%
Long pg#,0 = x%
Long pg#,4 = y%
Long pg#,8 = xx%
Long pg#,12= yy%
Long pg#,16= xxx%
Long pg#,20= yyy% Long pg#,24= xxxx%
Long pg#,24= xxxx%
Long pg#,28= yyyy%
Polygon (%hdc,pg#,4)
Endproc
|
| | | | |
|
AntwortenThemenoptionen | 1.756 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |