Deutsch
Forum

Überlegung: Projektion von Punken im Raum auf die Ebene - 3D

 

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
def 3dx(2) ((!vpa*(vpx!+@!(1)))/((vpz!+@!(2))/100))+!cam_fx
def 3dy(2) ((!vpa*(vpy!+@!(1)))/((vpz!+@!(2))/100))+!cam_fy

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

 
10.09.2007  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.756 Betrachtungen

Unbenanntvor 0 min.

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

iF (1x)
Peter Mallow (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie