Ooops
November 25, 2020, 08:24:24 AM

Author Topic: [bb] 3D math functions by N [ 1+ years ago ]  (Read 656 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] 3D math functions by N [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : 3D math functions
Author : N
Posted : 1+ years ago

Description : Various functions used in Vein R3; if you don't know what it does, chances are you don't need it.

Code :
Code: BlitzBasic
  1. ;#Region DESCRIPTION
  2.         ;; Math functions, Vector class taken from the Anima engine (written by me)
  3. ;#End Region
  4.  
  5. ;#Region CLASSES
  6.         Type Vector
  7.                 Field X#
  8.                 Field Y#
  9.                 Field Z#
  10.         End Type
  11.        
  12.         Type Size
  13.                 Field Width#
  14.                 Field Height#
  15.                 Field Depth#
  16.         End Type
  17.        
  18.         Type Cube
  19.                 Field Position.Vector
  20.                 Field Size.Size
  21.         End Type
  22.        
  23.         Type Rectangle
  24.                 Field X,Y,Width,Height
  25.                 Field Onscreen
  26.         End Type
  27. ;#End Region
  28.  
  29. ;#Region PROCEDURES
  30.         Function Size.Size(Width#=0,Height#=0,Depth#=0)
  31.                 Local s.Size = New Size
  32.                 sWidth = Width
  33.                 sHeight = Height
  34.                 sDepth = Depth
  35.                 Return s
  36.         End Function
  37.        
  38.         Function Vector.Vector(X#=0,Y#=0,Z#=0)
  39.                 Local v.Vector = New Vector
  40.                 vX = X
  41.                 vY = Y
  42.                 v = Z
  43.                 Return v
  44.         End Function
  45.        
  46.         Function VectorAdd(a.Vector,b.Vector)
  47.                 aX =aX + bX
  48.                 aY =aY + bY
  49.                 a =a + b
  50.         End Function
  51.        
  52.         Function VectorSubtract(a.Vector,b.Vector)
  53.                 aX =aX - bX
  54.                 aY =aY - bY
  55.                 a =a - b
  56.         End Function
  57.        
  58.         Function VectorSum.Vector(a.Vector,b.Vector)
  59.                 Return Vector(aX+bX,aY+bY,a+b)
  60.         End Function
  61.        
  62.         Function VectorDifference.Vector(a.Vector,b.Vector)
  63.                 Return Vector(aX-bX,aY-bY,a-b)
  64.         End Function
  65.        
  66.         Function VectorMultiply(a.Vector,b.Vector)
  67.                 aX =aX * bX
  68.                 aY =aY * bY
  69.                 a =a * b
  70.         End Function
  71.        
  72.         Function VectorDivide(a.Vector,b.Vector)
  73.                 aX =aX / bX
  74.                 aY =aY / bY
  75.                 a =a / b
  76.         End Function
  77.        
  78.         Function VectorProduct.Vector(a.Vector,b.Vector)
  79.                 Return Vector(aX*bX,aY*bY,a*b)
  80.         End Function
  81.        
  82.         Function VectorQuotient.Vector(a.Vector,b.Vector)
  83.                 Return Vector(aX/bX,aY/bY,a/b)
  84.         End Function
  85.        
  86.         Function VectorCross.Vector(a.Vector,b.Vector)
  87.                 Return Vector( (aY*b)-(a*bY), (a*bX)-(aX*b), (aX*bY)-(aY*bX) )
  88.         End Function
  89.        
  90.         Function VectorDot#(a.Vector,b.Vector)
  91.                 Return (aX*bX) + (aY*bY) + (a*b)
  92.         End Function
  93.        
  94.         Function VectorAngle#(a.Vector,b.Vector)
  95.                 Local d# = VectorDot(a,b)
  96.                 Local m# = VectorMagnitude(a)*VectorMagnitude(b)
  97.                 Return ACos(d#/m#)
  98.         End Function
  99.        
  100.         Function VectorNormalize(a.Vector)
  101.                 Local m# = VectorMagnitude(a)
  102.                 aX = aX / m#
  103.                 aY = aY / m#
  104.                 a = a / m#
  105.         End Function
  106.        
  107.         Function VectorMagnitude#(a.Vector)
  108.                 Return Sqr(aX*aX + aY*aY + a*a)
  109.         End Function
  110.        
  111.         Function VectorScale(a.Vector,b#)
  112.                 aX = aX * b#
  113.                 aY = aY * b#
  114.                 a = a * b#
  115.         End Function
  116.        
  117.         Function VectorSDivide(a.Vector,b#)
  118.                 aX = aX / b#
  119.                 aY = aY / b#
  120.                 a = a / b#
  121.         End Function
  122.        
  123.         Function MinF#(A#,B#)
  124.                 If A < B Then Return B
  125.                 Return A
  126.         End Function
  127.        
  128.         Function MinI%(A%,B%)
  129.                 If A < B Then Return B
  130.                 Return A
  131.         End Function
  132.        
  133.         Function MaxF#(A#,B#)
  134.                 If A > B Then Return B
  135.                 Return A
  136.         End Function
  137.        
  138.         Function MaxI%(A%,B%)
  139.                 If A > B Then Return B
  140.                 Return A
  141.         End Function
  142.        
  143.         Function ConstrictF#(A#,B#,C#)
  144.                 If A > C Then
  145.                         While A > C
  146.                                 A = A - (C-B)
  147.                         Wend
  148.                 ElseIf A < B Then
  149.                         While A < B
  150.                                 A = A + (C-B)
  151.                         Wend
  152.                 EndIf
  153.                 Return A
  154.         End Function
  155.        
  156.         Function ConstrictI#(A%,B%,C%)
  157.                 If A > C Then
  158.                         While A > C
  159.                                 A = A - (C-B)
  160.                         Wend
  161.                 ElseIf A < B Then
  162.                         While A < B
  163.                                 A = A + (C-B)
  164.                         Wend
  165.                 EndIf
  166.                 Return A
  167.         End Function
  168.        
  169.         Function PointInRect(PX,PY,RX,RY,W,H)
  170.                 Return (PX >= RX) And (PY >= RY) And (PX <= RX+W) And (PY <= RY+H)
  171.         End Function
  172.        
  173.         Function NearestPower(N#)
  174.                 v# = 1
  175.                 While N# > v#
  176.                         v# = v# * 2
  177.                 Wend
  178.                 k# = v# - N#
  179.                 Return v/(1 Or (k# > v/4))
  180.         End Function
  181.        
  182.         Function GetCube.Cube(Camera,x#,y#,z#,sx#,sy#,sz#)
  183.                 Local MinX=9999,MinY=9999,MaxX=-9999,MaxY=-9999,MaxZ=-9999
  184.                
  185.                 Local c = Camera
  186.                
  187.                 CameraProject c,x,y,z
  188.                 px = ProjectedX()
  189.                 py = ProjectedY()
  190.                 pz = ProjectedZ()
  191.                
  192.                 If px < MinX Then MinX = px
  193.                 If py < MinY Then MinY = py
  194.                 If px > MaxX Then MaxX = px
  195.                 If py > MaxY Then MaxY = py
  196.                 If pz > MaxZ Then MaxZ = pz
  197.                
  198.                 CameraProject c,sx,y,z
  199.                 px = ProjectedX()
  200.                 py = ProjectedY()
  201.                 pz = ProjectedZ()
  202.                
  203.                 If px < MinX Then MinX = px
  204.                 If py < MinY Then MinY = py
  205.                 If px > MaxX Then MaxX = px
  206.                 If py > MaxY Then MaxY = py
  207.                 If pz > MaxZ Then MaxZ = pz
  208.                
  209.                 CameraProject c,sx,y,sz
  210.                 px = ProjectedX()
  211.                 py = ProjectedY()
  212.                 pz = ProjectedZ()
  213.                
  214.                 If px < MinX Then MinX = px
  215.                 If py < MinY Then MinY = py
  216.                 If px > MaxX Then MaxX = px
  217.                 If py > MaxY Then MaxY = py
  218.                 If pz > MaxZ Then MaxZ = pz
  219.                
  220.                 CameraProject c,x,y,sz
  221.                 px = ProjectedX()
  222.                 py = ProjectedY()
  223.                 pz = ProjectedZ()
  224.                
  225.                 If px < MinX Then MinX = px
  226.                 If py < MinY Then MinY = py
  227.                 If px > MaxX Then MaxX = px
  228.                 If py > MaxY Then MaxY = py
  229.                 If pz > MaxZ Then MaxZ = pz
  230.                
  231.                 CameraProject c,x,sy,z
  232.                 px = ProjectedX()
  233.                 py = ProjectedY()
  234.                 pz = ProjectedZ()
  235.                
  236.                 If px < MinX Then MinX = px
  237.                 If py < MinY Then MinY = py
  238.                 If px > MaxX Then MaxX = px
  239.                 If py > MaxY Then MaxY = py
  240.                 If pz > MaxZ Then MaxZ = pz
  241.                
  242.                 CameraProject c,sx,sy,z
  243.                 px = ProjectedX()
  244.                 py = ProjectedY()
  245.                 pz = ProjectedZ()
  246.                
  247.                 If px < MinX Then MinX = px
  248.                 If py < MinY Then MinY = py
  249.                 If px > MaxX Then MaxX = px
  250.                 If py > MaxY Then MaxY = py
  251.                 If pz > MaxZ Then MaxZ = pz
  252.                
  253.                 CameraProject c,sx,sy,sz
  254.                 px = ProjectedX()
  255.                 py = ProjectedY()
  256.                 pz = ProjectedZ()
  257.                
  258.                 If px < MinX Then MinX = px
  259.                 If py < MinY Then MinY = py
  260.                 If px > MaxX Then MaxX = px
  261.                 If py > MaxY Then MaxY = py
  262.                 If pz > MaxZ Then MaxZ = pz
  263.                
  264.                 CameraProject c,x,sy,sz
  265.                 px = ProjectedX()
  266.                 py = ProjectedY()
  267.                 pz = ProjectedZ()
  268.                
  269.                 If px < MinX Then MinX = px
  270.                 If py < MinY Then MinY = py
  271.                 If px > MaxX Then MaxX = px
  272.                 If py > MaxY Then MaxY = py
  273.                 If pz > MaxZ Then MaxZ = pz
  274.                
  275.                 i.Cube = New Cube
  276.                 iPosition = Vector(MinX,MinY,-1)
  277.                 iSize = Size(MaxX-MinX,MaxY-MinY,MaxZ)
  278.                 Return i
  279.         End Function
  280.        
  281.         Function CubeInCamera(Camera,x#,y#,z#,sx#,sy#,sz#)
  282.                 Local c = Camera
  283.                 Local MinX=9999,MinY=9999,MaxX=-9999,MaxY=-9999
  284.                
  285.                 CameraProject c,x,y,z
  286.                 px = ProjectedX()
  287.                 py = ProjectedY()
  288.                 If ProjectedZ() >= 1 Then
  289.                         If px < MinX Then MinX = px
  290.                         If px > MaxX Then MaxX = px
  291.                         If py < MinY Then MinY = py
  292.                         If py > MaxY Then MaxY = py
  293.                 EndIf
  294.                 z = z + ProjectedZ()
  295.                
  296.                 CameraProject c,sx,y,z
  297.                 px = ProjectedX()
  298.                 py = ProjectedY()
  299.                 If ProjectedZ() >= 1 Then
  300.                         If px < MinX Then MinX = px
  301.                         If px > MaxX Then MaxX = px
  302.                         If py < MinY Then MinY = py
  303.                         If py > MaxY Then MaxY = py
  304.                 EndIf
  305.                 z = z + ProjectedZ()
  306.                
  307.                 CameraProject c,sx,y,sz
  308.                 px = ProjectedX()
  309.                 py = ProjectedY()
  310.                 If ProjectedZ() >= 1 Then
  311.                         If px < MinX Then MinX = px
  312.                         If px > MaxX Then MaxX = px
  313.                         If py < MinY Then MinY = py
  314.                         If py > MaxY Then MaxY = py
  315.                 EndIf
  316.                 z = z + ProjectedZ()
  317.                
  318.                 CameraProject c,x,y,sz
  319.                 px = ProjectedX()
  320.                 py = ProjectedY()
  321.                 If ProjectedZ() >= 1 Then
  322.                         If px < MinX Then MinX = px
  323.                         If px > MaxX Then MaxX = px
  324.                         If py < MinY Then MinY = py
  325.                         If py > MaxY Then MaxY = py
  326.                 EndIf
  327.                 z = z + ProjectedZ()
  328.                
  329.                 CameraProject c,x,sy,z
  330.                 px = ProjectedX()
  331.                 py = ProjectedY()
  332.                 If ProjectedZ() >= 1 Then
  333.                         If px < MinX Then MinX = px
  334.                         If px > MaxX Then MaxX = px
  335.                         If py < MinY Then MinY = py
  336.                         If py > MaxY Then MaxY = py
  337.                 EndIf
  338.                 z = z + ProjectedZ()
  339.                
  340.                 CameraProject c,sx,sy,z
  341.                 px = ProjectedX()
  342.                 py = ProjectedY()
  343.                 If ProjectedZ() >= 1 Then
  344.                         If px < MinX Then MinX = px
  345.                         If px > MaxX Then MaxX = px
  346.                         If py < MinY Then MinY = py
  347.                         If py > MaxY Then MaxY = py
  348.                 EndIf
  349.                 z = z + ProjectedZ()
  350.                
  351.                 CameraProject c,sx,sy,sz
  352.                 px = ProjectedX()
  353.                 py = ProjectedY()
  354.                 If ProjectedZ() >= 1 Then
  355.                         If px < MinX Then MinX = px
  356.                         If px > MaxX Then MaxX = px
  357.                         If py < MinY Then MinY = py
  358.                         If py > MaxY Then MaxY = py
  359.                 EndIf
  360.                 z = z + ProjectedZ()
  361.                
  362.                 CameraProject c,x,sy,sz
  363.                 px = ProjectedX()
  364.                 py = ProjectedY()
  365.                 If ProjectedZ() >= 1 Then
  366.                         If px < MinX Then MinX = px
  367.                         If px > MaxX Then MaxX = px
  368.                         If py < MinY Then MinY = py
  369.                         If py > MaxY Then MaxY = py
  370.                 EndIf
  371.                 z = z + ProjectedZ()
  372.                 Stop
  373.                 If z <= 0 Then Return
  374.                
  375.                 Return RectsOverlap(0,0,GraphicsWidth(),GraphicsHeight(),MinX,MinY,maxx-minx,maxy-miny)
  376.         End Function
  377.        
  378.         Function GetMeshAABB.Cube(Mesh,glbl=1)
  379.                 c.Cube = New Cube
  380.                 cPosition = Vector()
  381.                 cSize = Size()
  382.                
  383.                 Local min#[3]
  384.                 Local max#[3]
  385.                
  386.                 For x# = 0 To 3
  387.                         min[x] = 65536
  388.                         max[x] = -65536
  389.                 Next
  390.                
  391.                 Local MX = 1
  392.                 Local MY = 2
  393.                 Local MZ = 3
  394.                
  395.                 For surfaces = 1 To CountSurfaces(Mesh)
  396.                         s = GetSurface(Mesh,surfaces)
  397.                         For i = 0 To CountVertices(s)-1
  398.                                 x# = VertexX(s,i)
  399.                                 y# = VertexY(s,i)
  400.                                 z# = VertexZ(s,i)
  401.                                
  402.                                 If glbl Then
  403.                                         TFormPoint x,y,z,Mesh,0
  404.                                         x = TFormedX()
  405.                                         y = TFormedY()
  406.                                         z = TFormedZ()
  407.                                 EndIf
  408.                                
  409.                                 If x < min[MX] Then min[MX] = x
  410.                                 If x > max[MX] Then max[MX] = x
  411.                                
  412.                                 If y < min[MY] Then min[MY] = y
  413.                                 If y > max[MY] Then max[MY] = y
  414.                                
  415.                                 If z < min[MZ] Then min[MZ] = z
  416.                                 If z > max[MZ] Then max[MZ] = z
  417.                         Next
  418.                 Next
  419.                
  420.                 cPositionx = min[MX]-.1
  421.                 cPositiony = min[MY]-.1
  422.                 cPositionz = min[MZ]-.1
  423.                 cSizeWidth = max[MX]-min[MX]+.2
  424.                 cSizeheight = max[MY]-min[MY]+.2
  425.                 cSizedepth = max[MZ]-min[MZ]+.2
  426.                 Return c
  427.         End Function
  428.        
  429.         Function AABBToScreen.Rectangle(Camera,x#,y#,z#,width#,height#,depth#)
  430.                 r.Rectangle = New Rectangle
  431.                
  432.                 Local minx=16777215,miny=16777215,maxx=-16777215,maxy=-16777215
  433.                
  434.                 CameraProject Camera,x,y,z
  435.                 zs = zs + (ProjectedZ() > 0)
  436.                 px = ProjectedX()
  437.                 py = ProjectedY()
  438.                
  439.                 If px > maxx Then maxx = px
  440.                 If px < minx Then minx = px
  441.                
  442.                 If py > maxy Then maxy = py
  443.                 If py < miny Then miny = py
  444.                
  445.                 CameraProject Camera,x+width,y,z
  446.                 zs = zs + (ProjectedZ() > 0)
  447.                 px = ProjectedX()
  448.                 py = ProjectedY()
  449.                
  450.                 If px > maxx Then maxx = px
  451.                 If px < minx Then minx = px
  452.                
  453.                 If py > maxy Then maxy = py
  454.                 If py < miny Then miny = py
  455.                
  456.                 CameraProject Camera,x+width,y,z+depth
  457.                 zs = zs + (ProjectedZ() > 0)
  458.                 px = ProjectedX()
  459.                 py = ProjectedY()
  460.                
  461.                 If px > maxx Then maxx = px
  462.                 If px < minx Then minx = px
  463.                
  464.                 If py > maxy Then maxy = py
  465.                 If py < miny Then miny = py
  466.                
  467.                 CameraProject Camera,x,y,z+depth
  468.                 zs = zs + (ProjectedZ() > 0)
  469.                 px = ProjectedX()
  470.                 py = ProjectedY()
  471.                
  472.                 If px > maxx Then maxx = px
  473.                 If px < minx Then minx = px
  474.                
  475.                 If py > maxy Then maxy = py
  476.                 If py < miny Then miny = py
  477.                
  478.                 CameraProject Camera,x,y+height,z
  479.                 zs = zs + (ProjectedZ() > 0)
  480.                 px = ProjectedX()
  481.                 py = ProjectedY()
  482.                
  483.                 If px > maxx Then maxx = px
  484.                 If px < minx Then minx = px
  485.                
  486.                 If py > maxy Then maxy = py
  487.                 If py < miny Then miny = py
  488.                
  489.                 CameraProject Camera,x+width,y+height,z
  490.                 zs = zs + (ProjectedZ() > 0)
  491.                 px = ProjectedX()
  492.                 py = ProjectedY()
  493.                
  494.                 If px > maxx Then maxx = px
  495.                 If px < minx Then minx = px
  496.                
  497.                 If py > maxy Then maxy = py
  498.                 If py < miny Then miny = py
  499.                
  500.                 CameraProject Camera,x+width,y+height,z+depth
  501.                 zs = zs + (ProjectedZ() > 0)
  502.                 px = ProjectedX()
  503.                 py = ProjectedY()
  504.                
  505.                 If px > maxx Then maxx = px
  506.                 If px < minx Then minx = px
  507.                
  508.                 If py > maxy Then maxy = py
  509.                 If py < miny Then miny = py
  510.                
  511.                 CameraProject Camera,x,y+height,z+depth
  512.                 zs = zs + (ProjectedZ() > 0)
  513.                 px = ProjectedX()
  514.                 py = ProjectedY()
  515.                
  516.                 If px > maxx Then maxx = px
  517.                 If px < minx Then minx = px
  518.                
  519.                 If py > maxy Then maxy = py
  520.                 If py < miny Then miny = py
  521.                
  522.                 rOnscreen = 1
  523.                 rx = minx
  524.                 ry = miny
  525.                 rwidth = maxx-minx
  526.                 rheight = maxy-miny
  527.                
  528.                 Return r
  529.         End Function
  530.        
  531.         Function FreeCube(c.Cube)
  532.                 If c = Null Then Return
  533.                 Delete cSize
  534.                 Delete cPosition
  535.                 Delete c
  536.         End Function
  537.        
  538.         Function PointInCube(x#,y#,z#,c.Cube)
  539.                 Return (x >= cPositionX And x <= cPositionX+cSizeWidth And y => cPositionY And y <= cPositionY+cSizeHeight And z => cPosition And z <= cPosition+cSizeDepth)
  540.         End Function
  541.        
  542.         Function CreateMeshBox(Entity)
  543.                 Local MinX#,MinY#,MinZ#
  544.                 Local MaxX#,MaxY#,MaxZ#
  545.                 For n = 1 To CountSurfaces(Entity)
  546.                         s = GetSurface(Entity,n)
  547.                         For i = 0 To CountVertices(s)-1
  548.                                 x# = VertexX(s,i)
  549.                                 y# = VertexY(s,i)
  550.                                 z# = VertexZ(s,i)
  551.                                
  552.                                 If x < MinX Then MinX = x
  553.                                 If x > MaxX Then MaxX = x
  554.                                
  555.                                 If y < MinY Then MinY = y
  556.                                 If y > MaxY Then MaxY = y
  557.                                
  558.                                 If z < MinZ Then MinZ = z
  559.                                 If z > MaxZ Then MaxZ = z
  560.                         Next
  561.                 Next
  562.                 EntityBox Entity,MaxX,MaxY,MaxZ,MinX-MaxX,MinY-MaxY,MinZ-MaxZ
  563.         End Function
  564. ;#End Region


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal