Fräsengine

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

unix hat geschrieben:Sry habs fertig und mal ohne Debuger kompiliert.

WOW ist das schnell
siehste wohl...

und so ein aha-erlebnis prägt sich ein. du wirst nie wieder mit debugger performance testen... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

Jo das ist Dumm
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Zumal muss man nicht immer die Position neu ausrechnen. Wenn man den ganzen Bereich durchgeht (erst y, dann x) braucht man einfach nur die größe eines bildpunktes zurechnen. Bei Linien nur auf der y-Achse brauchst du nur den bufferpitch zu addieren (für jeden Pixel), nach dem du die Adresse einmal ausgerechnet hast. Bei der x-Achse ists die Byte-Größe für einen Pixelpunkt. Nochmal ein Quelltext zur Anregung:

Code: Alles auswählen

Procedure RenderPixelLine(*d.dbuffer, x.l,y.l, height.l, r.l, g.l, b.l)
  Protected bits.l, temp.l, position.l
  
  ;erst vorberechnen, was zu poken, dann eventuell farbwerte tauschen und durchlaufen lassen
  
  Select *d\bufferpixelformat
    Case #PB_PixelFormat_24Bits_RGB  ; 3 Byte pro Pixel (RRGGBB)
      bits = 3
    Case #PB_PixelFormat_24Bits_BGR  ; 3 Byte pro Pixel (BBGGRR)
      bits = 3
      temp = b
      b = r
      r = temp
    Case #PB_PixelFormat_32Bits_RGB  ; 4 Byte pro Pixel (RRGGBB)
      bits = 4
    Case #PB_PixelFormat_32Bits_BGR  ; 4 Byte pro Pixel (BBGGRR)
      bits = 4
      temp = b
      b = r
      r = temp
  EndSelect

  position = *d\buffer + (y * *d\bufferpitch) + (x * bits)

  For zy = 0 To height-1
    PokeB(position+0, r)
    PokeB(position+1, g)
    PokeB(position+2, b)
    
    position + *d\bufferpitch
  Next
  
EndProcedure
Der Quellcoder zeichnet eine vertikale Linie mit entsprechender Farbe und Position auf den Bildschirm.
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Beitrag von Falko »

unix hat geschrieben:ja ist ja erst ma eine art engine

mein ziel ist es eine NC Simulation durchzuführen nicht CNC

für unsere Kunzmann Fräse auf der Arbeit

Da es für diese Programmiersparche kein Simulationsprogramm gibt

Ausbilder wird sich freuen :D


Wenn das Programm fertig ist stelle ich ne Demo zur verfügung!
Habe gerade diesen Thread gefunden. Vor kurzem war ich in einem
4-wöchigen Lehrgang für Sinumeric CNC und habe an einem CNC-Simulator
meine Eingaben ausprobieren können. Wenn man sieht wie teuer solche
Programme sind, wäre es sehr schön, wenn sich hier noch ein paar mehr
an soeiner Simulation mit Quelltexte beteiligen könnten. Ich habe vor kurzem mal mit einem Beispiel aus dem englischen Forum etwas herumgespielt und will ebenfalls versuchen, sowas zu machen.
Man kann sich zwar bei http://www.cncsimulator.com/download.shtml eine Freeware laden, doch ist diese sehr eingeschränkt, sodas man sich evt. eine Vollversion kaufen müsste. Hier mal mein minimalversuch auf 2D, Marke einfach nur so :wink:

Code: Alles auswählen

If InitSprite() And InitSprite3D() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
EndIf
Enumeration
 #Sprite_0
 #Sprite_1
 #Text_X
 #Display_X
 #Text_Y
 #Display_Y
EndEnumeration
Global FR.l,WZ.l
Global Radius.d,BreiteX.d,LaengeY.d,x.d,direction.d
 Procedure Fraeser(Durchmesser.l,Col.l)
      Radius=Durchmesser/2
      FR=CreateSprite(#Sprite_0, Durchmesser, Durchmesser,#PB_Sprite_Texture)
      If StartDrawing(SpriteOutput(0))
          Circle(Radius,Radius,Radius,Col)
         StopDrawing()
         CreateSprite3D(#Sprite_0,#Sprite_0)
      EndIf
      ProcedureReturn FR
 EndProcedure 

Procedure Werkstueck(BreiteX,LaengeY,HoeheZ,Col.l)
       CreateSprite(#Sprite_1,BreiteX,LaengeY)
       StartDrawing(SpriteOutput(#Sprite_1))
       Box(0,0,BreiteX,LaengeY,Col)
       StopDrawing()
   
 EndProcedure 
  
  If OpenWindow(0, 0, 0, 640, 480, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ButtonGadget(0, 530, 370, 45, 20, "Quit")
      TextGadget(#Text_X,485,12,10,20,"X")
      TextGadget(#Display_X,500,10,50,20,"0.000",#PB_Text_Border )
      TextGadget(#Text_Y,485,32,10,20,"Y")
      TextGadget(#Display_Y,500,30,50,20,"0.000",#PB_Text_Border )
    EndIf
    If OpenWindowedScreen(WindowID(0), 0, 0, 480, 400, 0, 0, 0)
       Fraeser(30,RGB(0,254,0))
       Werkstueck(200,200,20,RGB(0,0,254))
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               End
    EndIf
  EndIf
  
  direction = 2
  
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ;
    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(1,30,30)
    Start3D()
     DisplaySprite3D(0, x, x,255)
     StartDrawing(SpriteOutput(1))
     If direction=2
       Circle(x-15,x-15,Radius,RGB(col1, Col2, Col3))

     ;ElseIf direction=-2
     ;  Circle(x-15,x-15,10,RGB(0, 0, 255))
     EndIf
     StopDrawing()
    Stop3D()
     x + direction
     SetGadgetText(#Display_X,StrF(x ,0))
     SetGadgetText(#Display_Y,StrF(x ,0))
    If x >200: direction = -2 : EndIf
    If x < 0   :Col1=Random(255):Col2=Random(255):Col2=Random(255): direction = 2 : EndIf
    ;Delay(1)
  ForEver
Vielleicht könnte man das ja auch noch ausbauen. Noch eine weitere Idee
kommt von KG. Mittels POV-Ray könnte man über Pb erstellte Scripts eine 3D-Renderung als Ergebnis erzeugen. Vielleicht sind daran noch mehr interessiert die hier was dazu beitragen möchten.

Grüße ..Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Antworten