Code archives/3D Graphics - Misc/Box Mapper
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Creates uv coords for a mesh | |||||
;Box Mapping ;(c)2002 David Bird ;enquire@davebird.fsnet.co.uk ;www.davebird.fsnet.co.uk Type vector Field x# Field y# Field z# Field u# Field v# End Type Global Tnorm.vector=New vector Global CProd.vector=New vector Global Normal.vector=New vector Graphics3D 640,480,0,2 SetBuffer BackBuffer() cam=CreateCamera() PositionEntity cam,0,0,-3 sp=CreateCube() tex=LoadTexture("tex0.jpg") EntityTexture sp,tex BoxMap sp,.5,.5 c=CreateCube() PositionEntity c,4,4,8 EntityTexture c,tex Repeat If KeyDown(200) Then TurnEntity sp,1,0,0 If KeyDown(208) Then TurnEntity sp,-1,0,0 If KeyDown(203) Then TurnEntity sp,0,0,1 If KeyDown(205) Then TurnEntity sp,0,0,-1 RenderWorld Flip Until KeyDown(1) End Function BoxMap(ent,scaleu#=1,scalev#=1) c=CreateCube() ScaleMesh c,.5,.5,.5 FlipMesh c EntityPickMode c,2 For s=1 To CountSurfaces(ent) surf=GetSurface(ent,s) For t=0 To CountTriangles(surf)-1 ;first find the direction of the triangle by normal ;flat shaded will work i0=TriangleVertex(surf,t,0) i1=TriangleVertex(surf,t,1) i2=TriangleVertex(surf,t,2) x0#=VertexX(surf,i0) y0#=VertexY(surf,i0) z0#=VertexZ(surf,i0) x1#=VertexX(surf,i1) y1#=VertexY(surf,i1) z1#=VertexZ(surf,i1) x2#=VertexX(surf,i2) y2#=VertexY(surf,i2) z2#=VertexZ(surf,i2) GetNormal(x0,y0,z0,x1,y1,z1,x2,y2,z2) dx#=Abs(TNorm\x) dy#=Abs(TNorm\y) dz#=Abs(TNorm\z) If dx>=dy And dx>=dz Then LinePick 0,0,0,2*x0,2*y0,2*z0 VertexTexCoords surf,i0,PickedY()+0.5,PickedZ()+0.5 LinePick 0,0,0,2*x1,2*y1,2*z1 VertexTexCoords surf,i1,PickedY()+0.5,PickedZ()+0.5 LinePick 0,0,0,2*x2,2*y2,2*z2 VertexTexCoords surf,i2,PickedY()+0.5,PickedZ()+0.5 EndIf If dy>dx And dy>=dz Then LinePick 0,0,0,2*x0,2*y0,2*z0 VertexTexCoords surf,i0,PickedX()+0.5,PickedZ()+0.5 LinePick 0,0,0,2*x1,2*y1,2*z1 VertexTexCoords surf,i1,PickedX()+0.5,PickedZ()+0.5 LinePick 0,0,0,2*x2,2*y2,2*z2 VertexTexCoords surf,i2,PickedX()+0.5,PickedZ()+0.5 EndIf If dz>dx And dz>dy Then LinePick 0,0,0,2*x0,2*y0,2*z0 VertexTexCoords surf,i0,PickedX()+0.5,PickedY()+0.5 LinePick 0,0,0,2*x1,2*y1,2*z1 VertexTexCoords surf,i1,PickedX()+0.5,PickedY()+0.5 LinePick 0,0,0,2*x2,2*y2,2*z2 VertexTexCoords surf,i2,PickedX()+0.5,PickedY()+0.5 EndIf VertexTexCoords surf,i0,VertexU(surf,i0)/scaleu,VertexV(surf,i0)/scalev VertexTexCoords surf,i1,VertexU(surf,i1)/scaleu,VertexV(surf,i1)/scalev VertexTexCoords surf,i2,VertexU(surf,i2)/scaleu,VertexV(surf,i2)/scalev Next Next FreeEntity c End Function Function GetNormal(x1#,y1#,z1#,x2#,y2#,z2#,x3#,y3#,z3#) xx1#=x2-x1:yy1#=y2-y1:zz1#=z2-z1 xx2#=x3-x1:yy2#=y3-y1:zz2#=z3-z1 Norm(xx1,yy1,zz1) xx1=NormX():yy1=normy():zz1=normz() Norm(xx2,yy2,zz2) xx2=NormX():yy2=normy():zz2=normz() CrossProduct(xx2,yy2,zz2,xx1,yy1,zz1) TNorm\x=CProductX() TNorm\y=CProductY() TNorm\z=CProductZ() Normalise TNorm End Function Function CrossProduct(x1#,y1#,z1#,x2#,y2#,z2#) CProd\x=(y1*z2)-(z1*y2) CProd\y=(z1*x2)-(x1*z2) CProd\z=(x1*y2)-(y1*x2) End Function Function Norm(x#,y#,z#) l# = Mag(x,y,z) Normal\x=x/l Normal\y=y/l Normal\z=z/l End Function Function Mag#(x#,y#,z#) Return Sqr(x^2+y^2+z^2) End Function Function Normalise(a.vector) l# = Mag(a\x,a\y,a\z) a\x=a\x/l a\y=a\y/l a\z=a\z/l Return End Function Function NormX#() Return Normal\x End Function Function NormY#() Return Normal\y End Function Function NormZ#() Return Normal\z End Function Function CproductX#() Return CProd\x End Function Function CproductY#() Return CProd\y End Function Function CproductZ#() Return CProd\z End Function |
Comments
None.
Code Archives Forum