Popular Post Starg Posted July 25, 2013 Popular Post Posted July 25, 2013 (edited) S3d.au3 This UDF enables you to draw simple 3D graphics. Features:Simple and easy to useDoesn't require external libraries. You don't need OpenGL or DirectX. Available Functions:_S3d_SelectGraphic($hGraphic, $iWidth, $iHeight, $iSmooth = 2) _S3d_SelectPen($hPen) _S3d_SelectBrush($hBrush) _S3d_SelectFont($hFont) _S3d_SelectFormat($hFormat) _S3d_SetClipCount($iCount) _S3d_Dist($nPos1X = 0, $nPos1Y = 0, $nPos1Z = 0, $nPos2X = 0, $nPos2Y = 0, $nPos2Z = 0) _S3d_DistFromCamera($nPosX = 0, $nPosY = 0, $nPosZ = 0) _S3d_SetCamera($nCameraX, $nCameraY, $nCameraZ, $nTargetX, $nTargetY, $nTargetZ, $nVAngle = 0, $nFAngle = 0.8, $nFScale = 1000) _S3d_SetCameraEx($nCameraX, $nCameraY, $nCameraZ, $nXYAngle = 0, $nXZAngle = 0, $nVAngle = 0, $nFAngle = 0.8, $nFScale = 1000) _S3d_SetLocalMatrix($n00 = 1, $n01 = 0, $n02 = 0, $n03 = 0, $n10 = 0, $n11 = 1, $n12 = 0, $n13 = 0, $n20 = 0, $n21 = 0, $n22 = 1, $n23 = 0, $n30 = 0, $n31 = 0, $n32 = 0, $n33 = 1) _S3d_MultiplyLocalMatrix($n00 = 1, $n01 = 0, $n02 = 0, $n03 = 0, $n10 = 0, $n11 = 1, $n12 = 0, $n13 = 0, $n20 = 0, $n21 = 0, $n22 = 1, $n23 = 0, $n30 = 0, $n31 = 0, $n32 = 0, $n33 = 1, $fRefresh = True) _S3d_LocalTranslate($nX, $nY, $nZ, $fRefresh = True) _S3d_LocalScale($nX, $nY, $nZ, $fRefresh = True) _S3d_LocalRotateX($nAngle, $fDeg = False, $fRefresh = True) _S3d_LocalRotateY($nAngle, $fDeg = False, $fRefresh = True) _S3d_LocalRotateZ($nAngle, $fDeg = False, $fRefresh = True) _S3d_GetLocalMatrix() _S3d_SetLocalMatrixEx(ByRef $aMatrix) _S3d_GetPos($nX, $nY, $nZ) _S3d_InitCurrentPos() _S3d_MoveTo($nX, $nY, $nZ = Default) _S3d_Clear($nColor = 0xFF000000) _S3d_Line($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2) _S3d_LineTo($nX, $nY, $nZ) _S3d_Box($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2) _S3d_Arrow($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2, $nLen = 30, $nAngle = 0.6) _S3d_Circle($nX, $nY, $nZ, $nRad, $fFill = False) _S3d_Polygon($aPoints, $fFill = False) _S3d_RegPolygon($nX, $nY, $nZ, $nRad, $iNum, $fFill = True) _S3d_Star($nX, $nY, $nZ, $nRad1, $nRad2, $iNum, $fFill = True) _S3d_Square($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2, $nX3, $nY3, $nZ3, $nX4, $nY4, $nZ4, $fFill = True) _S3d_MoveTo2($nXL, $nYL, $nZL, $nXR, $nYR, $nZR) _S3d_RibbonTo($nXL, $nYL, $nZL, $nXR, $nYR, $nZR) _S3d_String($sString, $nX, $nY, $nZ)New version!S3d.zipv1.3.1 (09/JUN/2014)* ArchivesS3d.zipv1.3.0 (05/SEP/2013)S3d.zipv1.2.3 (16/AUG/2013)Enjoy! Edited June 9, 2014 by Starg jaberwacky, mesale0077, codewar509 and 6 others 9
UEZ Posted July 25, 2013 Posted July 25, 2013 Nice work. If you set smoothing for the gfx handle it looks much better Func _S3d_SelectGraphic($hGraphic, $iWidth, $iHeight) $__S3d_hGraphic = $hGraphic $__S3d_iWidth = $iWidth $__S3d_iHeight = $iHeight _GDIPlus_GraphicsSetSmoothingMode($__S3d_hGraphic, 2) EndFunc ;==>_S3d_SelectGraphicUsing matrices to rotate the object is cool. Br, UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
Starg Posted July 25, 2013 Author Posted July 25, 2013 UEZ, Thanks for the advice. Using matrices to rotate the object is cool. I'm going to write some examples to show the power of Local Matrices.
tirpider Posted July 26, 2013 Posted July 26, 2013 This looks like something I can use. I have a small program for editing meshes but it lacks a preview feature and have to use another program to see my results. It is able to draw UV stamps for the models using GDI, so it shouldn't be too different to adapt to this. This looks approachable. Thanks for sharing. I'll be back with results after trying it out.
Starg Posted July 26, 2013 Author Posted July 26, 2013 UPDATE New version (v1.1.0) released! Please see the first post. Added: _S3d_RegPolygon, _S3d_Star Added: _S3d_LocalTranslate, _S3d_LocalScale, _S3d_LocalRotateX, _S3d_LocalRotateY, _S3d_LocalRotateZ Added: _S3d_SelectGraphic sets smoothing mode for Graphics object Changed: default value of $fFill in _S3d_Square changed to True Enjoy!
Starg Posted July 26, 2013 Author Posted July 26, 2013 UPDATE New version (v1.1.1) released! Please see the first post. Added an example of _S3d_Star function. Any comments are welcome.
UEZ Posted July 26, 2013 Posted July 26, 2013 Using floating point calls gives the movement more smoothness:S3d.au3expandcollapse popup;================================================= ; S3d - Simple 3D Graphic Library ; v1.1.1 (26/JUL/2013) ; ; Author: Starg ; ; - Tested on: Windows XP SP3 ; AutoIt v3.3.8.1, v3.3.9.12 ; - Requires GDIPlus.au3 ; ; * Use at your own risk! ; ; - Special Thanks: S.Programs ;================================================= #include-once #include <GDIPlus.au3> ;================================================= ; Constants ;================================================= Global Const $__S3d_PI = 3.14159265358979 ;================================================= ; Global Variables ;================================================= Global $__S3d_hGraphic, $__S3d_iWidth, $__S3d_iHeight Global $__S3d_nFAngleTan, $__S3d_nFScale Global $__S3d_hPen, $__S3d_hBrush, $__S3d_hFont, $__S3d_hFormat Global $__S3d_aConvertMatrix = __S3d_CreateMatrix() Global $__S3d_aLocalMatrix = __S3d_CreateMatrix() Global $__S3d_aCameraMatrix = __S3d_CreateMatrix() Global $__S3d_aCameraPos[3] ; $__S3d_nPosBuf0X and $__S3d_nPosBuf0Y are used as "Current Position" Global $__S3d_nPosBuf0X, $__S3d_nPosBuf0Y, $__S3d_nPosBuf1X, $__S3d_nPosBuf1Y ;================================================= ; Functions ;================================================= ; _S3d_SelectGraphic -- select a graphic object to write to Func _S3d_SelectGraphic($hGraphic, $iWidth, $iHeight) $__S3d_hGraphic = $hGraphic $__S3d_iWidth = $iWidth $__S3d_iHeight = $iHeight _GDIPlus_GraphicsSetSmoothingMode($__S3d_hGraphic, 2) ; Thanks to UEZ EndFunc ;==>_S3d_SelectGraphic ; _S3d_SelectPen -- select a pen object Func _S3d_SelectPen($hPen) $__S3d_hPen = $hPen EndFunc ;==>_S3d_SelectPen ; _S3d_SelectBrush -- select a brush object Func _S3d_SelectBrush($hBrush) $__S3d_hBrush = $hBrush EndFunc ;==>_S3d_SelectBrush ; _S3d_SelectFont -- select a Font object Func _S3d_SelectFont($hFont) $__S3d_hFont = $hFont EndFunc ;==>_S3d_SelectFont ; _S3d_SelectFormat -- select a String Format object Func _S3d_SelectFormat($hFormat) $__S3d_hFormat = $hFormat EndFunc ;==>_S3d_SelectFormat ;================================================= ; _S3d_Dist -- returns the distance betwenn two points Func _S3d_Dist($nPos1X = 0, $nPos1Y = 0, $nPos1Z = 0, $nPos2X = 0, $nPos2Y = 0, $nPos2Z = 0) Return Sqrt(($nPos2X - $nPos1X) ^ 2 + ($nPos2Y - $nPos1Y) ^ 2 + ($nPos2Z - $nPos1Z) ^ 2) EndFunc ;==>_S3d_Dist Func _S3d_DistFromCamera($nPosX = 0, $nPosY = 0, $nPosZ = 0) Return Sqrt(($nPosX - $__S3d_aCameraPos[0]) ^ 2 + ($nPosY - $__S3d_aCameraPos[1]) ^ 2 + ($nPosZ - $__S3d_aCameraPos[2]) ^ 2) EndFunc ;==>_S3d_DistFromCamera ; _S3d_SetCamera -- sets camera and target coordinates Func _S3d_SetCamera($nCameraX, $nCameraY, $nCameraZ, $nTargetX, $nTargetY, $nTargetZ, $nVAngle = 0, $nFAngle = 0.8, $nFScale = 1000) Local $nDist = _S3d_Dist($nTargetX, $nTargetY, $nTargetZ, $nCameraX, $nCameraY, $nCameraZ) Local $nXYLen = _S3d_Dist($nTargetX, $nTargetY, 0, $nCameraX, $nCameraY, 0) ; cos(-a) = cos(a) ; sin(-a) = - sin(a) Local $nXYCos = ($nTargetX - $nCameraX) / $nXYLen Local $nXYSin = -($nTargetY - $nCameraY) / $nXYLen Local $nXZCos = $nXYLen / $nDist Local $nXZSin = -($nTargetZ - $nCameraZ) / $nDist Local $aMxXY = __S3d_CreateMatrix(), $aMxXZ = __S3d_CreateMatrix(), $aMxV = __S3d_CreateMatrix() Local $aTransMatrix = __S3d_CreateMatrix() Local $aTempMatrix = __S3d_CreateMatrix() __S3d_SetMatrix($aTransMatrix, _ 1, 0, 0, -$nCameraX, _ 0, 1, 0, -$nCameraY, _ 0, 0, 1, -$nCameraZ, _ 0, 0, 0, 1) __S3d_SetMatrix($aMxXY, _ $nXYCos, -$nXYSin, 0, 0, _ $nXYSin, $nXYCos, 0, 0, _ 0, 0, 1, 0, _ 0, 0, 0, 1) __S3d_SetMatrix($aMxXZ, _ $nXZCos, 0, -$nXZSin, 0, _ 0, 1, 0, 0, _ $nXZSin, 0, $nXZCos, 0, _ 0, 0, 0, 1) __S3d_SetMatrix($aMxV, _ 1, 0, 0, 0, _ 0, Cos(-$nVAngle), -Sin(-$nVAngle), 0, _ 0, Sin(-$nVAngle), Cos(-$nVAngle), 0, _ 0, 0, 0, 1) __S3d_MultiplyMatrix($__S3d_aCameraMatrix, $aMxXY, $aTransMatrix) __S3d_MultiplyMatrix($aTempMatrix, $aMxXZ, $__S3d_aCameraMatrix) __S3d_MultiplyMatrix($__S3d_aCameraMatrix, $aMxV, $aTempMatrix) _S3d_SetLocalMatrix() $__S3d_nFAngleTan = Tan($nFAngle) $__S3d_nFScale = $nFScale $__S3d_aCameraPos[0] = $nCameraX $__S3d_aCameraPos[1] = $nCameraY $__S3d_aCameraPos[2] = $nCameraZ EndFunc ;==>_S3d_SetCamera ; _S3d_SetLocalMatrix - local coordinates -> world coordinates Func _S3d_SetLocalMatrix( _ $n00 = 1, $n01 = 0, $n02 = 0, $n03 = 0, _ $n10 = 0, $n11 = 1, $n12 = 0, $n13 = 0, _ $n20 = 0, $n21 = 0, $n22 = 1, $n23 = 0, _ $n30 = 0, $n31 = 0, $n32 = 0, $n33 = 1) __S3d_SetMatrix($__S3d_aLocalMatrix, _ $n00, $n01, $n02, $n03, _ $n10, $n11, $n12, $n13, _ $n20, $n21, $n22, $n23, _ $n30, $n31, $n32, $n33) __S3d_MultiplyMatrix($__S3d_aConvertMatrix, $__S3d_aCameraMatrix, $__S3d_aLocalMatrix) EndFunc ;==>_S3d_SetLocalMatrix ; _S3d_MultiplyLocalMatrix Func _S3d_MultiplyLocalMatrix( _ $n00 = 1, $n01 = 0, $n02 = 0, $n03 = 0, _ $n10 = 0, $n11 = 1, $n12 = 0, $n13 = 0, _ $n20 = 0, $n21 = 0, $n22 = 1, $n23 = 0, _ $n30 = 0, $n31 = 0, $n32 = 0, $n33 = 1) Local $aMatrix = __S3d_CreateMatrix(), $aBufLocalMatrix = $__S3d_aLocalMatrix __S3d_SetMatrix($aMatrix, _ $n00, $n01, $n02, $n03, _ $n10, $n11, $n12, $n13, _ $n20, $n21, $n22, $n23, _ $n30, $n31, $n32, $n33) __S3d_MultiplyMatrix($__S3d_aLocalMatrix, $aMatrix, $aBufLocalMatrix) __S3d_MultiplyMatrix($__S3d_aConvertMatrix, $__S3d_aCameraMatrix, $__S3d_aLocalMatrix) EndFunc ;==>_S3d_MultiplyLocalMatrix Func _S3d_LocalTranslate($nX, $nY, $nZ) _S3d_MultiplyLocalMatrix( _ 1, 0, 0, $nX, _ 0, 1, 0, $nY, _ 0, 0, 1, $nZ, _ 0, 0, 0, 1) EndFunc ;==>_S3d_LocalTranslate Func _S3d_LocalScale($nX, $nY, $nZ) _S3d_MultiplyLocalMatrix( _ $nX, 0, 0, 0, _ 0, $nY, 0, 0, _ 0, 0, $nZ, 0, _ 0, 0, 0, 1) EndFunc ;==>_S3d_LocalScale ; $nAngle is radians if $fDeg is false, degrees if true. Func _S3d_LocalRotateX($nAngle, $fDeg = False) If $fDeg Then $nAngle = __S3d_Deg2Rad($nAngle) _S3d_MultiplyLocalMatrix( _ 1, 0, 0, 0, _ 0, Cos($nAngle), -Sin($nAngle), 0, _ 0, Sin($nAngle), Cos($nAngle), 0, _ 0, 0, 0, 1) EndFunc ;==>_S3d_LocalRotateX Func _S3d_LocalRotateY($nAngle, $fDeg = False) If $fDeg Then $nAngle = __S3d_Deg2Rad($nAngle) _S3d_MultiplyLocalMatrix( _ Cos($nAngle), 0, -Sin($nAngle), 0, _ 0, 1, 0, 0, _ Sin($nAngle), 0, Cos($nAngle), 0, _ 0, 0, 0, 1) EndFunc ;==>_S3d_LocalRotateY Func _S3d_LocalRotateZ($nAngle, $fDeg = False) If $fDeg Then $nAngle = __S3d_Deg2Rad($nAngle) _S3d_MultiplyLocalMatrix( _ Cos($nAngle), -Sin($nAngle), 0, 0, _ Sin($nAngle), Cos($nAngle), 0, 0, _ 0, 0, 1, 0, _ 0, 0, 0, 1) EndFunc ;==>_S3d_LocalRotateZ Func _S3d_GetLocalMatrix() Return $__S3d_aLocalMatrix EndFunc ;==>_S3d_GetLocalMatrix ;================================================= ; _S3d_GetPos - converts 3D -> 2D Func _S3d_GetPos($nX, $nY, $nZ) Local $aPos[2] __S3d_ConvertPos($aPos[0], $aPos[1], $nX, $nY, $nZ) If @error Then Return SetError(1, 0, 0) Return $aPos EndFunc ;==>_S3d_GetPos Func _S3d_MoveTo($nX, $nY, $nZ = Default) If IsKeyword($nZ) Then $__S3d_nPosBuf0X = $nX $__S3d_nPosBuf0Y = $nY Else __S3d_ConvertPos($__S3d_nPosBuf0X, $__S3d_nPosBuf0Y, $nX, $nY, $nZ) If @error Then Return SetError(1, 0, 0) EndIf Return 1 EndFunc ;==>_S3d_MoveTo Func _S3d_Clear($nColor = 0xFF000000) Return _GDIPlus_GraphicsClear($__S3d_hGraphic, $nColor) EndFunc ;==>_S3d_Clear Func _S3d_Line($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2) Local $nOutX1, $nOutY1, $nOutX2, $nOutY2, $iError1, $iError2 __S3d_ConvertPos($nOutX1, $nOutY1, $nX1, $nY1, $nZ1) $iError1 = @error __S3d_ConvertPos($nOutX2, $nOutY2, $nX2, $nY2, $nZ2) $iError2 = @error If (Not $iError1) And (Not $iError2) Then ;~ _GDIPlus_GraphicsDrawLine($__S3d_hGraphic, $nOutX1, $nOutY1, $nOutX2, $nOutY2, $__S3d_hPen) DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $__S3d_hGraphic, "handle", $__S3d_hPen, "float", $nOutX1, "float", $nOutY1, "float", $nOutX2, "float", $nOutY2) Return 1 ElseIf (Not $iError1) Or (Not $iError2) Then ; clipping Local $nAX, $nAY, $nAZ, $nBX, $nBY, $nBZ Local $nCX, $nCY, $nCZ, $nPos3X, $nPos3Y If Not $iError1 Then $__S3d_nPosBuf0X = $nOutX1 $__S3d_nPosBuf0Y = $nOutY1 $nAX = $nX1 $nAY = $nY1 $nAZ = $nZ1 $nBX = $nX2 $nBY = $nY2 $nBZ = $nZ2 Else $__S3d_nPosBuf0X = $nOutX2 $__S3d_nPosBuf0Y = $nOutY2 $nAX = $nX2 $nAY = $nY2 $nAZ = $nZ2 $nBX = $nX1 $nBY = $nY1 $nBZ = $nZ1 EndIf Local $i For $i = 1 To 10 ; 2 ^ 10 = 1024 $nCX = ($nAX + $nBX) / 2 $nCY = ($nAY + $nBY) / 2 $nCZ = ($nAZ + $nBZ) / 2 __S3d_ConvertPos($nPos3X, $nPos3Y, $nCX, $nCY, $nCZ) If Not @error Then $nAX = $nCX $nAY = $nCY $nAZ = $nCZ ;~ _GDIPlus_GraphicsDrawLine($__S3d_hGraphic, $__S3d_nPosBuf0X, $__S3d_nPosBuf0Y, $nPos3X, $nPos3Y, $__S3d_hPen) DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $__S3d_hGraphic, "handle", $__S3d_hPen, "float", $__S3d_nPosBuf0X, "float", $__S3d_nPosBuf0Y, "float", $nPos3X, "float", $nPos3Y) $__S3d_nPosBuf0X = $nPos3X $__S3d_nPosBuf0Y = $nPos3Y Else $nBX = $nCX $nBY = $nCY $nBZ = $nCZ EndIf Next Return 2 Else Return 0 EndIf EndFunc ;==>_S3d_Line Func _S3d_LineTo($nX, $nY, $nZ) Local $nOutX, $nOutY __S3d_ConvertPos($nOutX, $nOutY, $nX, $nY, $nZ) ;~ _GDIPlus_GraphicsDrawLine($__S3d_hGraphic, $__S3d_nPosBuf0X, $__S3d_nPosBuf0Y, $nOutX, $nOutY, $__S3d_hPen) DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $__S3d_hGraphic, "handle", $__S3d_hPen, "float", $__S3d_nPosBuf0X, "float", $__S3d_nPosBuf0Y, "float", $nOutX, "float", $nOutY) $__S3d_nPosBuf0X = $nOutX $__S3d_nPosBuf0Y = $nOutY EndFunc ;==>_S3d_LineTo Func _S3d_Box($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2) _S3d_Line($nX1, $nY1, $nZ1, $nX2, $nY1, $nZ1) _S3d_Line($nX2, $nY1, $nZ1, $nX2, $nY2, $nZ1) _S3d_Line($nX2, $nY2, $nZ1, $nX1, $nY2, $nZ1) _S3d_Line($nX1, $nY2, $nZ1, $nX1, $nY1, $nZ1) _S3d_Line($nX1, $nY1, $nZ2, $nX2, $nY1, $nZ2) _S3d_Line($nX2, $nY1, $nZ2, $nX2, $nY2, $nZ2) _S3d_Line($nX2, $nY2, $nZ2, $nX1, $nY2, $nZ2) _S3d_Line($nX1, $nY2, $nZ2, $nX1, $nY1, $nZ2) _S3d_Line($nX1, $nY1, $nZ1, $nX1, $nY1, $nZ2) _S3d_Line($nX1, $nY2, $nZ1, $nX1, $nY2, $nZ2) _S3d_Line($nX2, $nY1, $nZ1, $nX2, $nY1, $nZ2) _S3d_Line($nX2, $nY2, $nZ1, $nX2, $nY2, $nZ2) EndFunc ;==>_S3d_Box Func _S3d_Arrow($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2, $nLen = 30, $nAngle = 0.6) If $nLen < 0 Then Return SetError(1, 0, 0) Local $nPos1X, $nPos1Y, $nPos2X, $nPos2Y __S3d_ConvertPos($nPos1X, $nPos1Y, $nX1, $nY1, $nZ1) If @error Then Return SetError(2, 0, 0) __S3d_ConvertPos($nPos2X, $nPos2Y, $nX2, $nY2, $nZ2) If @error Then Return SetError(3, 0, 0) ;~ _GDIPlus_GraphicsDrawLine($__S3d_hGraphic, $nPos1X, $nPos1Y, $nPos2X, $nPos2Y, $__S3d_hPen) DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $__S3d_hGraphic, "handle", $__S3d_hPen, "float", $nPos1X, "float", $nPos1Y, "float", $nPos2X, "float", $nPos2Y) Local $nDist = _S3d_Dist($nPos1X, $nPos1Y, 0, $nPos2X, $nPos2Y, 0) Local $nCenX = ($nPos1X - $nPos2X) / $nDist * $nLen Local $nCenY = ($nPos1Y - $nPos2Y) / $nDist * $nLen Local $nCos = Cos($nAngle), $nSin = Sin($nAngle) Local $aPosA1X = $nCenX * $nCos - $nCenY * $nSin + $nPos2X Local $aPosA1Y = $nCenX * $nSin + $nCenY * $nCos + $nPos2Y ; sin (-a) = - sin a ; cos (-a) = cos a Local $aPosA2X = $nCenX * $nCos + $nCenY * $nSin + $nPos2X Local $aPosA2Y = -$nCenX * $nSin + $nCenY * $nCos + $nPos2Y ;~ _GDIPlus_GraphicsDrawLine($__S3d_hGraphic, $nPos2X, $nPos2Y, $aPosA1X, $aPosA1Y, $__S3d_hPen) DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $__S3d_hGraphic, "handle", $__S3d_hPen, "float", $nPos2X, "float", $nPos2Y, "float", $aPosA1X, "float", $aPosA1Y) ;~ _GDIPlus_GraphicsDrawLine($__S3d_hGraphic, $nPos2X, $nPos2Y, $aPosA2X, $aPosA2Y, $__S3d_hPen) DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $__S3d_hGraphic, "handle", $__S3d_hPen, "float", $nPos2X, "float", $nPos2Y, "float", $aPosA2X, "float", $aPosA2Y) Return 1 EndFunc ;==>_S3d_Arrow Func _S3d_Circle($nX, $nY, $nZ, $nRad, $fFill = False) If $nRad <= 0 Then Return SetError(1, 0, 0) Local $nPosX, $nPosY ; (_S3d_DistFromCamera($nX, $nY, $nZ) * $__S3d_nFAngleTan) : $nRad = $__S3d_nFScale : $nVRad Local $nVRad = $nRad * $__S3d_nFScale / _S3d_DistFromCamera($nX, $nY, $nZ) / $__S3d_nFAngleTan __S3d_ConvertPos($nPosX, $nPosY, $nX, $nY, $nZ) If @error Then Return SetError(2, 0, 0) If $fFill Then ;~ Return _GDIPlus_GraphicsFillEllipse($__S3d_hGraphic, $nPosX - $nVRad, $nPosY - $nVRad, $nVRad * 2, $nVRad * 2, $__S3d_hBrush) Return DllCall($ghGDIPDll, "int", "GdipFillEllipse", "handle", $__S3d_hGraphic, "handle", $__S3d_hBrush, "float", $nPosX - $nVRad, "float", $nPosY - $nVRad, "float", $nVRad * 2, "float", $nVRad * 2) Else ;~ Return _GDIPlus_GraphicsDrawEllipse($__S3d_hGraphic, $nPosX - $nVRad, $nPosY - $nVRad, $nVRad * 2, $nVRad * 2, $__S3d_hPen) Return DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $__S3d_hGraphic, "handle", $__S3d_hPen, "float", $nPosX - $nVRad, "float", $nPosY - $nVRad, "float", $nVRad * 2, "float", $nVRad * 2) EndIf EndFunc ;==>_S3d_Circle ; $aPoints[0][0] : The number of points ; $aPoints[n][0] : nth X ; $aPoints[n][1] : nth Y ; $aPoints[n][2] : nth Z Func _S3d_Polygon($aPoints, $fFill = False) If Not IsArray($aPoints) Then Return SetError(1, 0, 0) Local $a2dPoints[$aPoints[0][0] + 1][2], $i $a2dPoints[0][0] = $aPoints[0][0] For $i = 1 To $aPoints[0][0] __S3d_ConvertPos($a2dPoints[$i][0], $a2dPoints[$i][1], $aPoints[$i][0], $aPoints[$i][1], $aPoints[$i][2]) If @error Then Return SetError(2, $i, 0) Next If $fFill Then ;~ SetError(_GDIPlus_GraphicsFillPolygon($__S3d_hGraphic, $a2dPoints, $__S3d_hBrush)) SetError(_GDIPlus_GraphicsFillPolygonF($__S3d_hGraphic, $a2dPoints, $__S3d_hBrush)) Else ;~ _GDIPlus_GraphicsDrawPolygon($__S3d_hGraphic, $a2dPoints, $__S3d_hPen) _GDIPlus_GraphicsDrawPolygonF($__S3d_hGraphic, $a2dPoints, $__S3d_hPen) EndIf Return 1 EndFunc ;==>_S3d_Polygon ; Always draw on XY plane Func _S3d_RegPolygon($nX, $nY, $nZ, $nRad, $iNum, $fFill = True) If $nRad <= 0 Then Return SetError(1, 0, 0) If (Not IsInt($iNum)) Or $iNum <= 0 Then Return SetError(2, 0, 0) Local $aPoints[$iNum + 1][3], $i, $nCurDir = 0 $aPoints[0][0] = $iNum For $i = 1 To $iNum $aPoints[$i][0] = $nX + $nRad * Cos($nCurDir) $aPoints[$i][1] = $nY + $nRad * Sin($nCurDir) $aPoints[$i][2] = $nZ $nCurDir += $__S3d_PI * 2 / $iNum Next Return _S3d_Polygon($aPoints, $fFill) EndFunc ;==>_S3d_RegPolygon ; Always draw on XY plane Func _S3d_Star($nX, $nY, $nZ, $nRad1, $nRad2, $iNum, $fFill = True) If $nRad1 <= 0 Then Return SetError(1, 0, 0) If $nRad2 <= 0 Then Return SetError(2, 0, 0) If (Not IsInt($iNum)) Or $iNum <= 0 Then Return SetError(3, 0, 0) Local $aPoints[$iNum * 2 + 1][3], $i, $nCurDir = 0 $aPoints[0][0] = $iNum * 2 For $i = 1 To $iNum * 2 Step 2 $aPoints[$i][0] = $nX + $nRad1 * Cos($nCurDir) $aPoints[$i][1] = $nY + $nRad1 * Sin($nCurDir) $aPoints[$i][2] = $nZ $nCurDir += $__S3d_PI / $iNum $aPoints[$i + 1][0] = $nX + $nRad2 * Cos($nCurDir) $aPoints[$i + 1][1] = $nY + $nRad2 * Sin($nCurDir) $aPoints[$i + 1][2] = $nZ $nCurDir += $__S3d_PI / $iNum Next Return _S3d_Polygon($aPoints, $fFill) EndFunc ;==>_S3d_Star Func _S3d_Square($nX1, $nY1, $nZ1, $nX2, $nY2, $nZ2, $nX3, $nY3, $nZ3, $nX4, $nY4, $nZ4, $fFill = True) Local $aPoints[5][3] = [[4, 0, 0], [$nX1, $nY1, $nZ1], [$nX2, $nY2, $nZ2], [$nX3, $nY3, $nZ3], [$nX4, $nY4, $nZ4]] Return _S3d_Polygon($aPoints, $fFill) EndFunc ;==>_S3d_Square Func _S3d_MoveTo2($nXL, $nYL, $nZL, $nXR, $nYR, $nZR) __S3d_ConvertPos($__S3d_nPosBuf0X, $__S3d_nPosBuf0Y, $nXL, $nYL, $nZL) If @error Then Return SetError(1, 0, 0) __S3d_ConvertPos($__S3d_nPosBuf1X, $__S3d_nPosBuf1Y, $nXR, $nYR, $nZR) If @error Then Return SetError(2, 0, 0) Return 1 EndFunc ;==>_S3d_MoveTo2 Func _S3d_RibbonTo($nXL, $nYL, $nZL, $nXR, $nYR, $nZR) Local $aPos[5][2] $aPos[0][0] = 4 $aPos[1][0] = $__S3d_nPosBuf0X $aPos[1][1] = $__S3d_nPosBuf0Y $aPos[2][0] = $__S3d_nPosBuf1X $aPos[2][1] = $__S3d_nPosBuf1Y __S3d_ConvertPos($aPos[4][0], $aPos[4][1], $nXL, $nYL, $nZL) If @error Then Return SetError(1, 0, 0) __S3d_ConvertPos($aPos[3][0], $aPos[3][1], $nXR, $nYR, $nZR) If @error Then Return SetError(2, 0, 0) ;~ _GDIPlus_GraphicsFillPolygon($__S3d_hGraphic, $aPos, $__S3d_hBrush) _GDIPlus_GraphicsFillPolygonF($__S3d_hGraphic, $aPos, $__S3d_hBrush) $__S3d_nPosBuf0X = $aPos[4][0] $__S3d_nPosBuf0Y = $aPos[4][1] $__S3d_nPosBuf1X = $aPos[3][0] $__S3d_nPosBuf1Y = $aPos[3][1] EndFunc ;==>_S3d_RibbonTo Func _S3d_String($sString, $nX, $nY, $nZ) Local $nPosX, $nPosY __S3d_ConvertPos($nPosX, $nPosY, $nX, $nY, $nZ) If @error Then Return SetError(1, 0, 0) Local $tLayout = _GDIPlus_RectFCreate($nPosX, $nPosY, 0, 0) Local $aInfo = _GDIPlus_GraphicsMeasureString($__S3d_hGraphic, $sString, $__S3d_hFont, $tLayout, $__S3d_hFormat) Return _GDIPlus_GraphicsDrawStringEx($__S3d_hGraphic, $sString, $__S3d_hFont, $aInfo[0], $__S3d_hFormat, $__S3d_hBrush) EndFunc ;==>_S3d_String ;================================================= ; Functions (Internal use only) ;================================================= ; __S3d_Rotate -- ($nInX, $nInY) -> ($nOutX, $nOutY) Func __S3d_Rotate(ByRef $nOutX, ByRef $nOutY, $nInX, $nInY, $nCenterX, $nCenterY, $nAngle) $nOutX = ($nInX - $nCenterX) * Cos($nAngle) - ($nInY - $nCenterY) * Sin($nAngle) + $nInX $nOutY = ($nInX - $nCenterX) * Sin($nAngle) + ($nInY - $nCenterY) * Cos($nAngle) + $nInY EndFunc ;==>__S3d_Rotate Func __S3d_CreateMatrix() Local $aMatrix[4][4], $i, $j For $i = 0 To 3 For $j = 0 To 3 $aMatrix[$i][$j] = 0 Next Next Return $aMatrix EndFunc ;==>__S3d_CreateMatrix Func __S3d_SetMatrix(ByRef $aMatrix, _ $n00 = 1, $n01 = 0, $n02 = 0, $n03 = 0, _ $n10 = 0, $n11 = 1, $n12 = 0, $n13 = 0, _ $n20 = 0, $n21 = 0, $n22 = 1, $n23 = 0, _ $n30 = 0, $n31 = 0, $n32 = 0, $n33 = 1) $aMatrix[0][0] = $n00 $aMatrix[0][1] = $n01 $aMatrix[0][2] = $n02 $aMatrix[0][3] = $n03 $aMatrix[1][0] = $n10 $aMatrix[1][1] = $n11 $aMatrix[1][2] = $n12 $aMatrix[1][3] = $n13 $aMatrix[2][0] = $n20 $aMatrix[2][1] = $n21 $aMatrix[2][2] = $n22 $aMatrix[2][3] = $n23 $aMatrix[3][0] = $n30 $aMatrix[3][1] = $n31 $aMatrix[3][2] = $n32 $aMatrix[3][3] = $n33 EndFunc ;==>__S3d_SetMatrix ; $aOutMatrix = $nInMatrix1 * $nInMatrix2 Func __S3d_MultiplyMatrix(ByRef $aOutMatrix, ByRef $aInMatrix1, ByRef $aInMatrix2) Local $i, $j, $k For $i = 0 To 3 For $j = 0 To 3 $aOutMatrix[$i][$j] = 0 For $k = 0 To 3 $aOutMatrix[$i][$j] += $aInMatrix1[$i][$k] * $aInMatrix2[$k][$j] Next Next Next EndFunc ;==>__S3d_MultiplyMatrix ; __S3d_ConvertPos - converts 3D -> 2D Func __S3d_ConvertPos(ByRef $nOutX, ByRef $nOutY, $nInX, $nInY, $nInZ) Local $aInPos[4] = [$nInX, $nInY, $nInZ ,1], $aOutPos[4] = [0, 0, 0, 0], $i, $j For $i = 0 To 3 For $j = 0 To 3 $aOutPos[$i] += $__S3d_aConvertMatrix[$i][$j] * $aInPos[$j] Next Next If $aOutPos[0] <= 0 Then Return SetError(1, 0, 0) ; behind the camera $nOutX = (- $aOutPos[1] / $aOutPos[0] / $__S3d_nFAngleTan) * ($__S3d_nFScale / 2) + ($__S3d_iWidth / 2) $nOutY = (- $aOutPos[2] / $aOutPos[0] / $__S3d_nFAngleTan) * ($__S3d_nFScale / 2) + ($__S3d_iHeight / 2) Return 1 EndFunc ;==>__S3d_ConvertPos Func __S3d_Deg2Rad($nDeg) Return $nDeg / 180 * $__S3d_PI EndFunc ;==>__S3d_Deg2Rad Func _GDIPlus_GraphicsFillPolygonF($hGraphics, $aPoints, $hBrush = 0) Local $iCount = $aPoints[0][0] Local $tPoints = DllStructCreate("float[" & $iCount * 2 & "]") For $iI = 1 To $iCount DllStructSetData($tPoints, 1, $aPoints[$iI][0], (($iI - 1) * 2) + 1) DllStructSetData($tPoints, 1, $aPoints[$iI][1], (($iI - 1) * 2) + 2) Next __GDIPlus_BrushDefCreate($hBrush) Local $aResult = DllCall($ghGDIPDll, "int", "GdipFillPolygon", "handle", $hGraphics, "handle", $hBrush, _ "struct*", $tPoints, "int", $iCount, "int", "FillModeAlternate") Local $tmpError = @error, $tmpExtended = @extended __GDIPlus_BrushDefDispose() If $tmpError Then Return SetError($tmpError, $tmpExtended, False) Return $aResult[0] = 0 EndFunc ;==>_GDIPlus_GraphicsFillPolygon Func _GDIPlus_GraphicsDrawPolygonF($hGraphics, $aPoints, $hPen = 0) Local $iCount = $aPoints[0][0] Local $tPoints = DllStructCreate("float[" & $iCount * 2 & "]") For $iI = 1 To $iCount DllStructSetData($tPoints, 1, $aPoints[$iI][0], (($iI - 1) * 2) + 1) DllStructSetData($tPoints, 1, $aPoints[$iI][1], (($iI - 1) * 2) + 2) Next __GDIPlus_PenDefCreate($hPen) Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawPolygon", "handle", $hGraphics, "handle", $hPen, "struct*", $tPoints, "int", $iCount) Local $tmpError = @error, $tmpExtended = @extended __GDIPlus_PenDefDispose() If $tmpError Then Return SetError($tmpError, $tmpExtended, False) Return $aResult[0] = 0 EndFunc ;==>_GDIPlus_GraphicsDrawPolygonBr,UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
tirpider Posted July 27, 2013 Posted July 27, 2013 Enjoying this. I have a question about _S3d_SetCamera() I am drawing a wireframe of a mesh using a vertex list and a triangle list. ( _S3d_Line() works perfect for this. ) But I am having trouble positioning the camera._S3d_SetCamera() accepts $position_x, $position_y, $position_z and $target_x, $target_y, $target_zTarget is behaving exactly how I expect it to.But when changing the position values, it seems to be rotating the view instead of translating. Local $position_x = $Model_Width / 2 Local $position_y = $Model_Height / 2 Local $position_z = $Model_depth * 2 ; guessing Local $target_x = 0 Local $target_y = 0 Local $target_z = 0 _S3d_SetCamera( $position_x, $position_y, $position_z, $target_x, $target_y, $target_z )I expected this to put the camera at roughly the center of mass in the x/y plane and some amount out along the z plane, looking at the mesh's feet (which are at 0,0,0.)Instead it is below and somewhere behind the origin.I am assuming x is left-right, y is up-down, and z is fore-aft.Is this correct?And do the position values translate or rotate? Or am I missing something completely.(attached a pic to show that it is indeed drawing.. which I find to be very cool.)
Starg Posted July 27, 2013 Author Posted July 27, 2013 I am assuming x is left-right, y is up-down, and z is fore-aft.Is this correct?By default, z is up-down. And do the position values translate or rotate? Or am I missing something completely.To translate the view, you need to change both Position and Target.Example:_S3d_SetCamera(500 + $i, 200, 300, $i, 0, 0)
tirpider Posted July 27, 2013 Posted July 27, 2013 I'm glad it was just a difference of axis alignments. I can accommodate that by just switching how I load the data from the vertex list.I started playing with the target values (instead of leaving them at 0) and the camera view began behaving as expected. Thanks for clearing that up.I intend to use this as a wireframe preview for a little mesh editing tool. It's just enough to help identify pieces and features within the model (that's all that is needed.) Once I have a cleaner implementation of it, I'll post an example of the code that uses your functions here.Thanks again for putting this together. I have ideas for working with 3d models, but am terrible at the math behind it.
Starg Posted July 27, 2013 Author Posted July 27, 2013 Thanks for using my UDF! Example usage of _S3d_SetLocalMatrix expandcollapse popup#include <GUIConstantsEx.au3> #include <S3d.au3> Main() Func Main() ; Create a window and initialize GDI+ Local $hGUI = GUICreate("S3d Example", 650, 550) GUISetState() _GDIPlus_Startup() Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI) Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(650, 550, $hGraphics) Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) Local $hFormat = _GDIPlus_StringFormatCreate() Local $hFamily = _GDIPlus_FontFamilyCreate("Arial") Local $hFont = _GDIPlus_FontCreate($hFamily, 30, 2) Local $hBrush = _GDIPlus_BrushCreateSolid(0xCC448844) ; Select a Graphic object ; width = 650, height = 550 _S3d_SelectGraphic($hGraphic, 650, 550) ; Select brush, font, and format object _S3d_SelectBrush($hBrush) _S3d_SelectFont($hFont) _S3d_SelectFormat($hFormat) Local $hPenB = _GDIPlus_PenCreate(0xAA0044FF, 2) Local $hPenR = _GDIPlus_PenCreate(0xAAFF6633, 3) Local $i = 0 ; Loop until user exits Do ; Clear the Graphics object _S3d_Clear(0xFFFFFFFF) ; Set camera _S3d_SetCamera(500 * Cos($i), 500 * Sin($i), 300 * Cos($i * 1.5), 0, 0, 0) _GDIPlus_GraphicsDrawString($hGraphic, "Camera (" & Round(500 * Cos($i)) & ", " & Round(500 * Sin($i)) & ", " & Round(300 * Cos($i * 1.5)) & ")", 20, 20) ;************************************************** ; _S3d_SetLocalMatrix examples Switch 1 ; <- change this! Case 0 ; do nothing Case 1 ; Y <-> Z _S3d_SetLocalMatrix( _ 1, 0, 0, 0, _ 0, 0, 1, 0, _ 0, 1, 0, 0, _ 0, 0, 0, 1) Case 2 ; Z -> -Z _S3d_SetLocalMatrix( _ 1, 0, 0, 0, _ 0, 1, 0, 0, _ 0, 0, -1, 0, _ 0, 0, 0, 1) Case 3 ; X -> Y, Y -> Z, Z -> X _S3d_SetLocalMatrix( _ 0, 1, 0, 0, _ 0, 0, 1, 0, _ 1, 0, 0, 0, _ 0, 0, 0, 1) Case 4 ; rotation in XZ plane by 2 radians This is equivalent to _S3d_LocalRotateY(2) _S3d_SetLocalMatrix( _ Cos(2), 0, -Sin(2), 0, _ 0, 1, 0, 0, _ Sin(2), 0, Cos(2), 0, _ 0, 0, 0, 1) Case 5 ; X -> X + 300 This is equivalent to _S3d_LocalTranslate(300, 0, 0) _S3d_SetLocalMatrix( _ 1, 0, 0, 300, _ 0, 1, 0, 0, _ 0, 0, 1, 0, _ 0, 0, 0, 1) Case 6 ; Z -> -Z _S3d_SetLocalMatrix( _ 1, 0, 0, 0, _ 0, 1, 0, 0, _ 0, 0, -1, 0, _ 0, 0, 0, 1) ; and then X -> X + 300 _S3d_MultiplyLocalMatrix( _ 1, 0, 0, 300, _ 0, 1, 0, 0, _ 0, 0, 1, 0, _ 0, 0, 0, 1) EndSwitch ;************************************************** ; Select a pen obiect _S3d_SelectPen($hPenB) ; Draw cube _S3d_Box(-100, -100, -100, 100, 100, 100) ; Select a pen obiect _S3d_SelectPen($hPenR) ; Draw an arrow from (0, 0, 0) to (200, 0, 0) _S3d_Arrow(0, 0, 0, 200, 0, 0) ; Draw a string _S3d_String("X", 250, 0, 0) _S3d_Arrow(0, 0, 0, 0, 200, 0) _S3d_String("Y", 0, 250, 0) _S3d_Arrow(0, 0, 0, 0, 0, 200) _S3d_String("Z", 0, 0, 250) ; Copy to the window _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0) $i += 0.04 Sleep(30) Until GUIGetMsg() = $GUI_EVENT_CLOSE ; Clean up resources _GDIPlus_PenDispose($hPenB) _GDIPlus_PenDispose($hPenR) _GDIPlus_BrushDispose($hBrush) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_Shutdown() GUIDelete($hGUI) EndFunc ;==>Main
DatMCEyeBall Posted July 27, 2013 Posted July 27, 2013 (edited) I made this FPS controller a while back, all you need to do is add a 3-D world and edit the _PlayerTransform() funtion. expandcollapse popup; Simple FPS style control, change the _PlayerTransform() function to use it in a game. #include <Misc.au3> ; #PUBLIC VARIABLES# ============================================================================== ; Position and rotation of the player, change it to alter the starting position. Global $anPlayerPosition[3] = [0, 0, 0] Global $anPlayerRotation[2] = [180, 0] Global $aiRotationLimit[2] = [180, 180] ; Limit for rotation, can be used to constrain rotation Global $nWalkSpeed = 0.1 ; Speed when walking (W, A, S, D) Global $nSprintSpeed = 0.25 ; Speed when sprinting (SHIFT+W) Global $nJumpHeight = 10 ; Height when jumping (SPACE) Global $nJumpSpeed = 1.5 Global $nFallSpeed = 1.0 Global $nClimbSpeed = 1.0 Global $nFloorHeight = 0 ; Height of the floor, change it and the player falls/climbs ; ================================================================================================= Global $fCrouched = False, $fJumping = False, $fGoingUp = False, $fLeftMouse = False Global $hDLL = DllOpen("user32.dll") ; _FPS_Control() should get called every frame AdlibRegister("_FPS_Control", 1000 / 30) HotKeySet("{ESC}", "_Exit") HotKeySet("{F2}", "_ChangeFloorHeight") ; The main loop (GUI, GDI+, etc) goes here While 1 Sleep(1000) WEnd ; This function should move the player to the mew position Func _PlayerTransform(ByRef $anPlayerPosition, ByRef $anPlayerRotation, $fCrouched, $fJumping, $fLeftMouse, $fMiddleMouse, $fRightMouse) ToolTip("XYZ = " & $anPlayerPosition[0] & ", " & $anPlayerPosition[1] & ", " & $anPlayerPosition[2] & @CRLF _ & "Rot = " & $anPlayerRotation[0] & ", " & $anPlayerRotation[1] & @CRLF _ & "$fCrouched = " & $fCrouched & @CRLF _ & "$fJumping = " & $fJumping & @CRLF & @CRLF _ & "$fLeftMouse = " & $fLeftMouse & @CRLF _ & "$fMiddleMouse = " & $fMiddleMouse & @CRLF _ & "$fRightMouse= " & $fRightMouse, 0, 0) EndFunc ;==>_PlayerTransform Func _ChangeFloorHeight() $sInput = InputBox("", "Input the new value for $nFloorHeight" & @CRLF & "$nFloorHeight = " & $nFloorHeight) If @error = 0 Then $nFloorHeight = Number($sInput) EndIf EndFunc ;==>_ChangeFloorHeight Func _Exit() DllClose($hDLL) Exit EndFunc ;==>_Exit Func _FPS_Control() If MouseGetPos(0) <= 0 Then MouseMove(@DesktopWidth - 2, MouseGetPos(1), 0) ElseIf MouseGetPos(0) >= @DesktopWidth - 1 Then MouseMove(0, MouseGetPos(1), 0) EndIf $anPlayerRotation[0] = (MouseGetPos(0) - (@DesktopWidth / 2)) / (@DesktopWidth / 2) * $aiRotationLimit[0] + $aiRotationLimit[0] $anPlayerRotation[0] = Round($anPlayerRotation[0]) $anPlayerRotation[1] = (MouseGetPos(1) - (@DesktopHeight / 2)) / (@DesktopHeight / 2) * $aiRotationLimit[1] $anPlayerRotation[1] = Round($anPlayerRotation[1]) $fLeftMouse = _IsPressed("01", $hDLL) $fMiddleMouse = _IsPressed("04", $hDLL) $fRightMouse = _IsPressed("02", $hDLL) If _IsPressed("57", $hDLL) Then If _IsPressed("10", $hDLL) Then $anPlayerPosition[1] += $nSprintSpeed Else $anPlayerPosition[1] += $nWalkSpeed EndIf ElseIf _IsPressed("53", $hDLL) Then If _IsPressed("10", $hDLL) Then $anPlayerPosition[1] -= $nSprintSpeed Else $anPlayerPosition[1] -= $nWalkSpeed EndIf EndIf If _IsPressed("41", $hDLL) Then If _IsPressed("10", $hDLL) Then $anPlayerPosition[0] -= $nSprintSpeed Else $anPlayerPosition[0] -= $nWalkSpeed EndIf EndIf If _IsPressed("44", $hDLL) Then If _IsPressed("10", $hDLL) Then $anPlayerPosition[0] += $nSprintSpeed Else $anPlayerPosition[0] += $nWalkSpeed EndIf EndIf If _GetButtonUp("11", $hDLL) Then If $fCrouched Then $anPlayerPosition[2] = $nFloorHeight Else $anPlayerPosition[2] = $nFloorHeight - 5 EndIf $fCrouched = Not $fCrouched $fJumping = False ElseIf $fJumping = False And _GetButtonUp("20", $hDLL) Then $fJumping = True $fGoingUp = True EndIf If $fJumping Then If $fGoingUp Then $anPlayerPosition[2] += $nJumpSpeed Else $anPlayerPosition[2] -= $nFallSpeed EndIf If $anPlayerPosition[2] >= $nFloorHeight + $nJumpHeight Then $fGoingUp = False EndIf If $fGoingUp = False Then If ($fCrouched And $anPlayerPosition[2] <= $nFloorHeight - 5) Or (Not $fCrouched And $anPlayerPosition[2] <= $nFloorHeight) Then $fJumping = False EndIf EndIf Else If ($fCrouched And $anPlayerPosition[2] < $nFloorHeight - 5) Or (Not $fCrouched And $anPlayerPosition[2] < $nFloorHeight) Then $anPlayerPosition[2] += $nClimbSpeed ElseIf ($fCrouched And $anPlayerPosition[2] > $nFloorHeight - 5) Or (Not $fCrouched And $anPlayerPosition[2] > $nFloorHeight) Then $anPlayerPosition[2] -= $nFallSpeed EndIf If $anPlayerPosition[2] <> $nFloorHeight And _IsBetween($anPlayerPosition[2], $nFloorHeight - $nFallSpeed, $nFloorHeight + $nClimbSpeed) Then If $fCrouched Then $anPlayerPosition[2] = $nFloorHeight - 5 Else $anPlayerPosition[2] = $nFloorHeight EndIf EndIf EndIf ; Round the XYZ pos For $x = 0 To 2 $anPlayerPosition[$x] = Round($anPlayerPosition[$x], 5) Next ; Call the tramsforming function _PlayerTransform($anPlayerPosition, $anPlayerRotation, $fCrouched, $fJumping, $fLeftMouse, $fMiddleMouse, $fRightMouse) EndFunc ;==>_FPS_Control Func _IsBetween($iNumber, $iLowNum, $iHighNum) Return $iNumber >= $iLowNum And $iNumber <= $iHighNum EndFunc ;==>_IsBetween Func _GetButtonUp($sHexKey, $vDLL) If _IsPressed($sHexKey, $vDLL) Then While _IsPressed($sHexKey, $vDLL) Sleep(10) WEnd Return True Else Return False EndIf EndFunc ;==>_GetButtonUp Edited July 28, 2013 by DatMCEyeBall "Just be fred, all we gotta do, just be fred." -Vocaliod "That is a Hadouken. A KAMEHAMEHA would have taken him 13 days and 54 episodes to form." - Roden Hoxha @tabhooked Clock made of cursors ♣ Desktop Widgets ♣ Water Simulation
Starg Posted July 27, 2013 Author Posted July 27, 2013 (edited) UPDATE New version (v1.1.2) released! Please see the first post._S3d_Arrow and _S3d_Square now work even if some of the points (one for _S3d_Arrow, up to three for _S3d_Square) are behind the camera. If you have written some example scripts that use S3d.au3, feel free to post them here. Edited July 28, 2013 by Starg
Danyfirex Posted July 27, 2013 Posted July 27, 2013 Very nice work. thank you. regards Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut
DatMCEyeBall Posted July 28, 2013 Posted July 28, 2013 (edited) UPDATENew version (v1.1.2) released! Please see the first post. _S3d_Arrow and _S3d_Square now work even if some of the points is behind the camera. If you have written some example scripts that use S3d.au3, feel free to post them here. Could you add an array that stores all the drawn objects so when I call _S3d_SetCamera() it redraws all the objects Edited July 28, 2013 by DatMCEyeBall "Just be fred, all we gotta do, just be fred." -Vocaliod "That is a Hadouken. A KAMEHAMEHA would have taken him 13 days and 54 episodes to form." - Roden Hoxha @tabhooked Clock made of cursors ♣ Desktop Widgets ♣ Water Simulation
AZJIO Posted July 28, 2013 Posted July 28, 2013 You can make the help file >by means of it My other projects or all
Starg Posted July 29, 2013 Author Posted July 29, 2013 Could you add an array that stores all the drawn objects so when I call _S3d_SetCamera() it redraws all the objects Thanks for the suggestion. I think making a wrapper for it is better than changing S3d itself.
Starg Posted July 29, 2013 Author Posted July 29, 2013 You can make the help file >by means of it Thanks. I'll try it.
DatMCEyeBall Posted July 29, 2013 Posted July 29, 2013 (edited) This might help: '?do=embed' frameborder='0' data-embedContent>> Edited July 29, 2013 by DatMCEyeBall "Just be fred, all we gotta do, just be fred." -Vocaliod "That is a Hadouken. A KAMEHAMEHA would have taken him 13 days and 54 episodes to form." - Roden Hoxha @tabhooked Clock made of cursors ♣ Desktop Widgets ♣ Water Simulation
Starg Posted July 29, 2013 Author Posted July 29, 2013 This might help:'?do=embed' frameborder='0' data-embedContent>> I found that a few months ago, but thanks anyway.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now