begin process at 2013 05 24 15:52:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > M3D (MOTEUR 3D POUR MIRC)

M3D (MOTEUR 3D POUR MIRC)


 Information sur la source

Note :
9,71 / 10 - par 7 personnes
9,71 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Niveau :Expert Date de création :22/12/2004 Date de mise à jour :18/05/2005 14:32:57 Vu / téléchargé :7 635 / 206

Auteur : aerith

Ecrire un message privé
Site perso
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
ceci est un moteur 3D pour mirc, il n'utilise aucune api 3D donc est tres lent
c'est pour cela que je l'est recoder en C avec SDL
http://www.cppfrance.com/code.aspx?ID=21731
Il vous permetra de coprendre les base de la 3D
-rotation (trigo)
-chargement de map (loader fichier)
-eclairage (vecteur normal)
-...

Source

  • ;m3D V1.2 par aerith "fabidou_aeris@hotmail.com"
  • ;Pour une utilisation partiel ou complette dans un script me prevenir svp
  • ;##htable m3d.option##
  • ;1 : zoom <n>
  • ;2 : cliping <n>
  • ;3 : camera <x> <y> <z>
  • ;4 : rotate <angle> <x> <y> <z>
  • ;5 : planar <0|1>
  • ;6 : allface <0|1>
  • ;##interface utilisateur##
  • alias m3d.option hadd m3d.option $1-
  • ;##initialisation moteur, creation de la htable m3d.option##
  • ;/init <zoom> <cliping> <camera>
  • alias m3d.init {
  • hfree -w m3d.*
  • hmake m3d.option 10
  • hadd m3d.option zoom $1
  • hadd m3d.option cliping $2
  • hadd m3d.option camera $3 $4 $5
  • hadd m3d.option rotate 0 0 0 0
  • hadd m3d.option planar 0
  • hadd m3d.option allface 0
  • }
  • ;##charge un .ase dans le moteur##
  • alias m3d.loader {
  • if (!$exists($1-)) { echo fichier inexistant | halt }
  • set %m3d.numvertex $gettok($read($1-,w,*MESH_NUMVERTEX*),2,32)
  • set %m3d.numface $gettok($read($1-,w,*MESH_NUMFACES*),2,32)
  • hfree -w m3d.mesh.*
  • hmake m3d.mesh.vertex.X %m3d.numvertex
  • hmake m3d.mesh.vertex.Y %m3d.numvertex
  • hmake m3d.mesh.vertex.Z %m3d.numvertex
  • hmake m3d.mesh.vertex.out %m3d.numvertex
  • hmake m3d.mesh.face.A %m3d.numface
  • hmake m3d.mesh.face.B %m3d.numface
  • hmake m3d.mesh.face.C %m3d.numface
  • hmake m3d.mesh.normal.X %m3d.numface
  • hmake m3d.mesh.normal.Y %m3d.numface
  • hmake m3d.mesh.normal.Z %m3d.numface
  • hmake m3d.mesh.centre.X %m3d.numface
  • hmake m3d.mesh.centre.Y %m3d.numface
  • hmake m3d.mesh.centre.Z %m3d.numface
  • hmake m3d.mesh.centre.out %m3d.numface
  • ;merci visionz :p
  • if ($fopen(m3d)) .fclose m3d
  • .fopen m3d $shortfn($1-)
  • var %no_ligne = 1, %t = $lines($1-), %ligne, %cur
  • while (%no_ligne <= %t) {
  • %ligne = $replace($fread(m3d),*,$chr(32),$chr(9),$chr(32),:,$chr(32),",$chr(32))
  • %cur = $gettok(%ligne,1,32)
  • var %a
  • if (%cur == MESH_VERTEX) {
  • %a = $calc($gettok(%ligne,2,32) + 1)
  • hadd m3d.mesh.vertex.X %a $gettok(%ligne,3,32)
  • hadd m3d.mesh.vertex.Y %a $gettok(%ligne,4,32)
  • hadd m3d.mesh.vertex.Z %a $gettok(%ligne,5,32)
  • }
  • elseif (%cur == MESH_FACE) {
  • %a = $calc($gettok(%ligne,2,32) + 1)
  • hadd m3d.mesh.face.A %a $calc($gettok(%ligne,4,32) + 1)
  • hadd m3d.mesh.face.B %a $calc($gettok(%ligne,6,32) + 1)
  • hadd m3d.mesh.face.C %a $calc($gettok(%ligne,8,32) + 1)
  • }
  • elseif (%cur == MESH_FACENORMAL) {
  • %a = $calc($gettok(%ligne,2,32) + 1)
  • hadd m3d.mesh.normal.X %a $gettok(%ligne,3,32)
  • hadd m3d.mesh.normal.Y %a $gettok(%ligne,4,32)
  • hadd m3d.mesh.normal.Z %a $gettok(%ligne,5,32)
  • }
  • inc %no_ligne 1
  • }
  • .fclose m3d
  • var %no_ligne 1
  • while (%no_ligne <= %m3d.numface) {
  • hadd m3d.mesh.centre.X %no_ligne $calc(($hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.A)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.B)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.C))) / 3)
  • hadd m3d.mesh.centre.Y %no_ligne $calc(($hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.A)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.B)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.C))) / 3)
  • hadd m3d.mesh.centre.Z %no_ligne $calc(($hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.A)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.B)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.C))) / 3)
  • inc %no_ligne
  • }
  • }
  • ;##calcul##
  • alias m3d.calcul {
  • if (!$window($1)) { echo fenetre inexistante | halt }
  • var %zoom = $hget(m3d.option,zoom)
  • var %cliping = $hget(m3d.option,cliping)
  • var %cm = $hget(m3d.option,camera)
  • var %cmx = $gettok(%cm,1,32)
  • var %cmy = $gettok(%cm,2,32)
  • var %cmz = $gettok(%cm,3,32)
  • var %rotate = $hget(m3d.option,rotate)
  • var %angle = $gettok(%rotate,1,32)
  • var %x = $gettok(%rotate,2,32)
  • var %y = $gettok(%rotate,3,32)
  • var %z = $gettok(%rotate,4,32)
  • var %cosT = $cos(%angle)
  • var %sinT = $sin(%angle)
  • var %cosT1 = $calc(1 - %cosT)
  • var %cosT2 = $calc(1 + %cosT)
  • var %xs = $calc(%x * %sinT)
  • var %ys = $calc(%y * %sinT)
  • var %zs = $calc(%z * %sinT)
  • var %ex1 = $calc(%cosT + %cosT1 * (%x * %x))
  • var %ex2 = $calc(%cosT1 * %x * %y - %zs)
  • var %ex3 = $calc(%cosT1 * %x * %z + %ys)
  • var %ey1 = $calc(%cosT2 * %x * %y + %zs)
  • var %ey2 = $calc(%cosT + %cosT1 * (%y * %y))
  • var %ey3 = $calc(%cosT1 * %y * %z - %xs)
  • var %ez1 = $calc(%cosT2 * %x * %z - %ys)
  • var %ez2 = $calc(%cosT1 * %y * %z + %xs)
  • var %ez3 = $calc(%cosT + %cosT1 * (%z * %z))
  • var %no_ligne 1
  • while (%no_ligne <= %m3d.numvertex) {
  • var %vx = $hget(m3d.mesh.vertex.X,%no_ligne)
  • var %vy = $hget(m3d.mesh.vertex.Y,%no_ligne)
  • var %vz = $hget(m3d.mesh.vertex.Z,%no_ligne)
  • hadd m3d.mesh.vertex.X %no_ligne $calc(%ex1 * %vx + %ex2 * %vy + %ex3 * %vz)
  • hadd m3d.mesh.vertex.Y %no_ligne $calc(%ey1 * %vx + %ey2 * %vy + %ey3 * %vz)
  • hadd m3d.mesh.vertex.Z %no_ligne $calc(%ez1 * %vx + %ez2 * %vy + %ez3 * %vz)
  • hadd m3d.mesh.vertex.out %no_ligne $calc(($hget(m3d.mesh.vertex.X,%no_ligne) + %cmx) * %zoom / (($hget(m3d.mesh.vertex.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).w / 2)) $calc(($hget(m3d.mesh.vertex.Y,%no_ligne) + %cmy) * %zoom / (($hget(m3d.mesh.vertex.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).h / 2))
  • inc %no_ligne
  • }
  • var %no_ligne 1
  • while (%no_ligne <= %m3d.numface) {
  • var %vx = $hget(m3d.mesh.normal.X,%no_ligne)
  • var %vy = $hget(m3d.mesh.normal.Y,%no_ligne)
  • var %vz = $hget(m3d.mesh.normal.Z,%no_ligne)
  • hadd m3d.mesh.normal.X %no_ligne $calc(%ex1 * %vx + %ex2 * %vy + %ex3 * %vz)
  • hadd m3d.mesh.normal.Y %no_ligne $calc(%ey1 * %vx + %ey2 * %vy + %ey3 * %vz)
  • hadd m3d.mesh.normal.Z %no_ligne $calc(%ez1 * %vx + %ez2 * %vy + %ez3 * %vz)
  • hadd m3d.mesh.centre.X %no_ligne $calc(($hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.A,%no_ligne)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.B,%no_ligne)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.C,%no_ligne))) / 3)
  • hadd m3d.mesh.centre.Y %no_ligne $calc(($hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.A,%no_ligne)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.B,%no_ligne)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.C,%no_ligne))) / 3)
  • hadd m3d.mesh.centre.Z %no_ligne $calc(($hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.A,%no_ligne)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.B,%no_ligne)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.C,%no_ligne))) / 3)
  • hadd m3d.mesh.centre.out %no_ligne $calc(($hget(m3d.mesh.centre.X,%no_ligne) + %cmx) * %zoom / (($hget(m3d.mesh.centre.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).w / 2)) $calc(($hget(m3d.mesh.centre.Y,%no_ligne) + %cmy) * %zoom / (($hget(m3d.mesh.centre.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).h / 2))
  • inc %no_ligne
  • }
  • }
  • ;##rendu##
  • alias m3d.render {
  • var %ticks = $ticks
  • var %a
  • drawrect -nrf $1 0 1 0 0 $window($1).w $window($1).h
  • var %no_ligne 1
  • var %cm = $hget(m3d.option,camera)
  • var %cmx = $gettok(%cm,1,32)
  • var %cmy = $gettok(%cm,2,32)
  • var %cmz = $gettok(%cm,3,32)
  • var %cmsqrt = $sqrt($calc((%cmx * %cmx) + (%cmy * %cmy) + (%cmz * %cmz)))
  • while (%no_ligne <= %m3d.numface) {
  • if (($hget(m3d.mesh.normal.Z,%no_ligne) < 0) || ($hget(m3d.option,allface) == 1)) {
  • %a = $sqrt($abs($calc((%cmx - $hget(m3d.mesh.centre.X, %no_ligne)) * (%cmx - $hget(m3d.mesh.centre.X, %no_ligne)))) + $abs($calc((%cmy - $hget(m3d.mesh.centre.Y, %no_ligne)) * (%cmy - $hget(m3d.mesh.centre.Y, %no_ligne)))) + $abs($calc((%cmz - $hget(m3d.mesh.centre.Z, %no_ligne)) * (%cmz - $hget(m3d.mesh.centre.Z, %no_ligne)))))
  • %a = $calc($hget(m3d.mesh.normal.Z,%no_ligne) * (%a / %cmsqrt) * -255)
  • echo - %a
  • drawline -n $1 $rgb(%a,%a,%a) 1 $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.A,%no_ligne)) $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.B,%no_ligne)) $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.C,%no_ligne)) $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.A,%no_ligne))
  • if ($hget(m3d.option,planar) == 1) drawfill -nr $1 $rgb(%a,%a,%a) 16777215 $hget(m3d.mesh.centre.out,%no_ligne)
  • }
  • inc %no_ligne
  • }
  • drawtext -bnr $1 16777215 0 tahoma 15 5 5 vertex : %m3d.numvertex , faces : %m3d.numface , fps : $int($calc(1000 / ($ticks - %ticks)))
  • drawtext -bnr $1 16777215 0 tahoma 15 5 22 camera : tx ty tz $hget(m3d.option,camera) , an rx ry rz $hget(m3d.option,rotate) , zoom $hget(m3d.option,zoom) , cliping $hget(m3d.option,cliping)
  • drawline $1
  • }
  • ;##fermeture du moteur##
  • alias m3d.fermer {
  • hfree -w m3d.*
  • unset %m3d.*
  • }
;m3D V1.2 par aerith "fabidou_aeris@hotmail.com"
;Pour une utilisation partiel ou complette dans un script me prevenir svp

;##htable m3d.option##
;1 : zoom <n>
;2 : cliping <n>
;3 : camera <x> <y> <z>
;4 : rotate <angle> <x> <y> <z>
;5 : planar <0|1>
;6 : allface <0|1>

;##interface utilisateur##
alias m3d.option hadd m3d.option $1-

;##initialisation moteur, creation de la htable m3d.option##
;/init <zoom> <cliping> <camera>
alias m3d.init {
  hfree -w m3d.*
  hmake m3d.option 10
  hadd m3d.option zoom $1
  hadd m3d.option cliping $2
  hadd m3d.option camera $3 $4 $5
  hadd m3d.option rotate 0 0 0 0
  hadd m3d.option planar 0
  hadd m3d.option allface 0
}

;##charge un .ase dans le moteur##
alias m3d.loader {
  if (!$exists($1-)) { echo fichier inexistant | halt }
  set %m3d.numvertex $gettok($read($1-,w,*MESH_NUMVERTEX*),2,32)
  set %m3d.numface $gettok($read($1-,w,*MESH_NUMFACES*),2,32)
  hfree -w m3d.mesh.*
  hmake m3d.mesh.vertex.X %m3d.numvertex
  hmake m3d.mesh.vertex.Y %m3d.numvertex
  hmake m3d.mesh.vertex.Z %m3d.numvertex

  hmake m3d.mesh.vertex.out %m3d.numvertex

  hmake m3d.mesh.face.A %m3d.numface
  hmake m3d.mesh.face.B %m3d.numface
  hmake m3d.mesh.face.C %m3d.numface

  hmake m3d.mesh.normal.X %m3d.numface
  hmake m3d.mesh.normal.Y %m3d.numface
  hmake m3d.mesh.normal.Z %m3d.numface

  hmake m3d.mesh.centre.X %m3d.numface
  hmake m3d.mesh.centre.Y %m3d.numface
  hmake m3d.mesh.centre.Z %m3d.numface

  hmake m3d.mesh.centre.out %m3d.numface

  ;merci visionz :p
  if ($fopen(m3d)) .fclose m3d
  .fopen m3d $shortfn($1-)
  var %no_ligne = 1, %t = $lines($1-), %ligne, %cur
  while (%no_ligne <= %t) {
    %ligne = $replace($fread(m3d),*,$chr(32),$chr(9),$chr(32),:,$chr(32),",$chr(32))
    %cur = $gettok(%ligne,1,32)
    var %a
    if (%cur == MESH_VERTEX) {
      %a = $calc($gettok(%ligne,2,32) + 1)
      hadd m3d.mesh.vertex.X %a $gettok(%ligne,3,32)
      hadd m3d.mesh.vertex.Y %a $gettok(%ligne,4,32)
      hadd m3d.mesh.vertex.Z %a $gettok(%ligne,5,32)
    }
    elseif (%cur == MESH_FACE) {
      %a = $calc($gettok(%ligne,2,32) + 1)
      hadd m3d.mesh.face.A %a $calc($gettok(%ligne,4,32) + 1)
      hadd m3d.mesh.face.B %a $calc($gettok(%ligne,6,32) + 1)
      hadd m3d.mesh.face.C %a $calc($gettok(%ligne,8,32) + 1)
    }
    elseif (%cur == MESH_FACENORMAL) {
      %a = $calc($gettok(%ligne,2,32) + 1)
      hadd m3d.mesh.normal.X %a $gettok(%ligne,3,32)
      hadd m3d.mesh.normal.Y %a $gettok(%ligne,4,32)
      hadd m3d.mesh.normal.Z %a $gettok(%ligne,5,32)
    }
    inc %no_ligne 1
  }
  .fclose m3d

  var %no_ligne 1
  while (%no_ligne <= %m3d.numface) {
    hadd m3d.mesh.centre.X %no_ligne $calc(($hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.A)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.B)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.C))) / 3)
    hadd m3d.mesh.centre.Y %no_ligne $calc(($hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.A)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.B)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.C))) / 3)
    hadd m3d.mesh.centre.Z %no_ligne $calc(($hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.A)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.B)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.C))) / 3)
    inc %no_ligne
  }
}

;##calcul##
alias m3d.calcul {
  if (!$window($1)) { echo fenetre inexistante | halt }
  var %zoom = $hget(m3d.option,zoom)
  var %cliping = $hget(m3d.option,cliping)
  var %cm = $hget(m3d.option,camera)
  var %cmx = $gettok(%cm,1,32)
  var %cmy = $gettok(%cm,2,32)
  var %cmz = $gettok(%cm,3,32)
  var %rotate = $hget(m3d.option,rotate)
  var %angle = $gettok(%rotate,1,32)
  var %x = $gettok(%rotate,2,32)
  var %y = $gettok(%rotate,3,32)
  var %z = $gettok(%rotate,4,32)
  var %cosT = $cos(%angle)
  var %sinT = $sin(%angle)
  var %cosT1 = $calc(1 - %cosT)
  var %cosT2 = $calc(1 + %cosT)
  var %xs = $calc(%x * %sinT)
  var %ys = $calc(%y * %sinT)
  var %zs = $calc(%z * %sinT)
  var %ex1 = $calc(%cosT + %cosT1 * (%x * %x))
  var %ex2 = $calc(%cosT1 * %x * %y - %zs)
  var %ex3 = $calc(%cosT1 * %x * %z + %ys)
  var %ey1 = $calc(%cosT2 * %x * %y + %zs)
  var %ey2 = $calc(%cosT + %cosT1 * (%y * %y))
  var %ey3 = $calc(%cosT1 * %y * %z - %xs)
  var %ez1 = $calc(%cosT2 * %x * %z - %ys)
  var %ez2 = $calc(%cosT1 * %y * %z + %xs)
  var %ez3 = $calc(%cosT + %cosT1 * (%z * %z))

  var %no_ligne 1
  while (%no_ligne <= %m3d.numvertex) {
    var %vx = $hget(m3d.mesh.vertex.X,%no_ligne)
    var %vy = $hget(m3d.mesh.vertex.Y,%no_ligne)
    var %vz = $hget(m3d.mesh.vertex.Z,%no_ligne)
    hadd m3d.mesh.vertex.X %no_ligne $calc(%ex1 * %vx + %ex2 * %vy + %ex3 * %vz)
    hadd m3d.mesh.vertex.Y %no_ligne $calc(%ey1 * %vx + %ey2 * %vy + %ey3 * %vz)
    hadd m3d.mesh.vertex.Z %no_ligne $calc(%ez1 * %vx + %ez2 * %vy + %ez3 * %vz)

    hadd m3d.mesh.vertex.out %no_ligne $calc(($hget(m3d.mesh.vertex.X,%no_ligne) + %cmx) * %zoom / (($hget(m3d.mesh.vertex.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).w / 2)) $calc(($hget(m3d.mesh.vertex.Y,%no_ligne) + %cmy) * %zoom / (($hget(m3d.mesh.vertex.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).h / 2))

    inc %no_ligne
  }

  var %no_ligne 1
  while (%no_ligne <= %m3d.numface) {
    var %vx = $hget(m3d.mesh.normal.X,%no_ligne)
    var %vy = $hget(m3d.mesh.normal.Y,%no_ligne)
    var %vz = $hget(m3d.mesh.normal.Z,%no_ligne)
    hadd m3d.mesh.normal.X %no_ligne $calc(%ex1 * %vx + %ex2 * %vy + %ex3 * %vz)
    hadd m3d.mesh.normal.Y %no_ligne $calc(%ey1 * %vx + %ey2 * %vy + %ey3 * %vz)
    hadd m3d.mesh.normal.Z %no_ligne $calc(%ez1 * %vx + %ez2 * %vy + %ez3 * %vz)

    hadd m3d.mesh.centre.X %no_ligne $calc(($hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.A,%no_ligne)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.B,%no_ligne)) + $hget(m3d.mesh.vertex.X,$hget(m3d.mesh.face.C,%no_ligne))) / 3)
    hadd m3d.mesh.centre.Y %no_ligne $calc(($hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.A,%no_ligne)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.B,%no_ligne)) + $hget(m3d.mesh.vertex.Y,$hget(m3d.mesh.face.C,%no_ligne))) / 3)
    hadd m3d.mesh.centre.Z %no_ligne $calc(($hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.A,%no_ligne)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.B,%no_ligne)) + $hget(m3d.mesh.vertex.Z,$hget(m3d.mesh.face.C,%no_ligne))) / 3)

    hadd m3d.mesh.centre.out %no_ligne $calc(($hget(m3d.mesh.centre.X,%no_ligne) + %cmx) * %zoom / (($hget(m3d.mesh.centre.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).w / 2)) $calc(($hget(m3d.mesh.centre.Y,%no_ligne) + %cmy) * %zoom / (($hget(m3d.mesh.centre.Z,%no_ligne) + %cmz) / %cliping) + ($window($1).h / 2))

    inc %no_ligne
  }
}

;##rendu##
alias m3d.render {
  var %ticks = $ticks
  var %a
  drawrect -nrf $1 0 1 0 0 $window($1).w $window($1).h
  var %no_ligne 1
  var %cm = $hget(m3d.option,camera)
  var %cmx = $gettok(%cm,1,32)
  var %cmy = $gettok(%cm,2,32)
  var %cmz = $gettok(%cm,3,32)
  var %cmsqrt = $sqrt($calc((%cmx * %cmx) + (%cmy * %cmy) + (%cmz * %cmz)))
  while (%no_ligne <= %m3d.numface) {
    if (($hget(m3d.mesh.normal.Z,%no_ligne) < 0) || ($hget(m3d.option,allface) == 1)) {
      %a = $sqrt($abs($calc((%cmx - $hget(m3d.mesh.centre.X, %no_ligne)) * (%cmx - $hget(m3d.mesh.centre.X, %no_ligne)))) + $abs($calc((%cmy - $hget(m3d.mesh.centre.Y, %no_ligne)) * (%cmy - $hget(m3d.mesh.centre.Y, %no_ligne)))) + $abs($calc((%cmz - $hget(m3d.mesh.centre.Z, %no_ligne)) * (%cmz - $hget(m3d.mesh.centre.Z, %no_ligne)))))
      %a = $calc($hget(m3d.mesh.normal.Z,%no_ligne) * (%a / %cmsqrt) * -255)
      echo - %a

      drawline -n $1 $rgb(%a,%a,%a) 1 $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.A,%no_ligne)) $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.B,%no_ligne)) $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.C,%no_ligne)) $hget(m3d.mesh.vertex.out,$hget(m3d.mesh.face.A,%no_ligne))

      if ($hget(m3d.option,planar) == 1) drawfill -nr $1 $rgb(%a,%a,%a) 16777215 $hget(m3d.mesh.centre.out,%no_ligne)
    }
    inc %no_ligne
  }
  drawtext -bnr $1 16777215 0 tahoma 15 5 5 vertex : %m3d.numvertex , faces : %m3d.numface , fps : $int($calc(1000 / ($ticks - %ticks)))
  drawtext -bnr $1 16777215 0 tahoma 15 5 22 camera : tx ty tz $hget(m3d.option,camera) , an rx ry rz $hget(m3d.option,rotate) , zoom $hget(m3d.option,zoom) , cliping $hget(m3d.option,cliping)
  drawline $1
}

;##fermeture du moteur##
alias m3d.fermer {
  hfree -w m3d.*
  unset %m3d.*
}

 Conclusion

pour l'installer :
-taper alt + R
-ensuite menu File / Load
-et charger m3d.mrc et test.mrc contenu dans le repertoire m3d

pout lancer une demo :
-taper /test dans mirc et choisissez la mesh .ase a charger dans le repertoire
  mesh .ase, apres un cour instant l'objet se met a tourner
-taper /test2 choisissez une map et utiliser les touches pour deplacer la camera
  2          : rx+
  8          : rx-
  4          : ry+
  6          : ry-
  1          : rz+
  3          : rz-
  gauche     : tx+
  droite     : tx-
  ctrl droit : ty+
  µ          : ty-
  haut       : tz+
  bas        : tz-
  +          : zoom+
  -          : zoom-
  /          : clip+
  *          : clip-

le moteur fonction grace a tres peut de fonctions
-permet de configurer le moteur
  /m3d.option <option...>
   <option> :
    zoom <n>
    cliping <n>
    camera <x> <y> <z>
    rotate <angle> <x> <y> <z>
    light <0|1>
    allface <0|1>

-initialise le moteur
  /m3d.init <zoom> <cliping> <camera x y z>

-charge un .ase dans le moteur
  /m3d.loader <fihier>

-effectue tout les calcul avec les parametre configurer
  /m3d.calcul <fenetre>

-rendu de la scene
  /m3d.render <fenetre>

-fermeture du moteur
  /m3d.fermer

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   m3d
  •   mesh
    •   terrain
      • terrain.ASETélécharger ce fichier [Réservé aux membres club]239 586 octets
    •   theiere
      • theiere 1.ASETélécharger ce fichier [Réservé aux membres club]19 847 octets
      • theiere 2.ASETélécharger ce fichier [Réservé aux membres club]76 536 octets
      • theiere 3.ASETélécharger ce fichier [Réservé aux membres club]171 570 octets
      • theiere 4.ASETélécharger ce fichier [Réservé aux membres club]304 610 octets
    •   tuture
      • tuture.ASETélécharger ce fichier [Réservé aux membres club]433 505 octets
      • tuture.maxTélécharger ce fichier [Réservé aux membres club]174 080 octets
    • cube.ASETélécharger ce fichier [Réservé aux membres club]4 483 octets
    • etoile.ASETélécharger ce fichier [Réservé aux membres club]24 207 octets
    • plan.ASETélécharger ce fichier [Réservé aux membres club]121 429 octets
    • sphere.ASETélécharger ce fichier [Réservé aux membres club]85 842 octets

Télécharger le zip


 Historique

18 mai 2005 14:32:57 :
V1.2 gros gain en FPS en reduisant les gettok petite optimisation du code

 Sources du même auteur

Source avec Zip Source avec une capture LECTEUR AUDIO MP3/MIDI/WAVE
Source avec Zip Source avec une capture COULEUR SYSTEM V4.4
Source avec Zip QUIZZ MULTISALON
Source avec une capture DISQUE
NICK SYSTEM V2

 Sources de la même categorie

Source avec Zip CRÉER DU MONDE SUR VOTRE SERVEUR IRC par Averell
AVOIR UNE LISTE D'UTILISATEUR EN COULEURS SELON LEURS SEXE P... par WorldDMT
COMMANDES FANTAISIES ( OP DEOP , VOICE DEVOICE ) ORIGINALES par Orona
Source avec Zip Source avec une capture CORRECTEUR par Orona
Source avec Zip Source avec une capture [DLL] DESSINER COMME LES PICWINS SUR UNE DIALOGBOX (BONUS: J... par uaip

Commentaires et avis

Commentaire de FearlessKire le 22/12/2004 14:32:19

aerith c'est du travail grandiose, je l'avais déjà vu sur un autre site mais n'avais pas laissé de commentaires...
Je tiens à te féliciter même si c'est très lent ça reste excellent...

J'aimerais d'ailleurs te parler de quelque chose de plus personnel, je t'enverrais un mail sus-cité en espérant qu'il est valide...

Merci et encore bravo.

NoFear.

Commentaire de KiNdErMaXi le 23/12/2004 15:20:36

c'est clair que c'est plutot impréssionnant
moi aussi j'avais vu ca sur scriptsdb mais je n'avais pas tester
chapeau
dis donc avec ca tu pourrai faire un solidworks
je sais pas si tu connais c'est un logiciel de construction de solide ;)
bravo

Commentaire de SornDrixer le 24/12/2004 12:13:50 administrateur CS

Hallucinant, il n'y a pas d'autre mot :)

Commentaire de Proutie66 le 26/12/2004 23:19:53

SI ya un autre mot ,  c'est enorme
10/10
( mettre moins serai un crime )

Commentaire de abdoulax le 28/12/2004 14:03:23

J'aurai bien aimé essayé ms ça bug sur ma bécanne ....

Have fun

Commentaire de aerith le 12/01/2005 18:56:48

ba heu, mici les gens :D

Pour solid works, ou toute sorte de jeux, ça serai pas genial car pour de bonne perf faudrai beaucoup limité en poly.
J'avais commencé un soft qui utilise le moteur en temp reel, mais je suis plus tres motivée par mirc. Vaudrai mieu passer par une dll...
Mais bon ce projet est surtout a but ludique

Commentaire de nightmar le 23/04/2005 13:59:21

excelent!

Commentaire de aerith le 25/05/2005 16:21:20

voila, c'est pareil mais en mieu :p

la version en C (sur le cppfrance) est beaucoup plus interessante :D

m'ci

Commentaire de genus1002 le 22/02/2007 13:57:01

genial mais il est gourmand le moteur

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales