3D Modell auf/in eine Windows Form

  • VB.NET
  • .NET (FX) 4.0

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    3D Modell auf/in eine Windows Form

    Hallo zusammen,
    Ich würde gern ein 3D Modell erstellen und auf/in einer Windows Form benutzen.
    Ich hab mir mal OpenTK runtergeladen, nur leider funktiniert das nicht (Nicht mal die Beispiele)...
    Habt ihr vllt. andere Lösungen mit der ich 3D Modelle erstellen und einbinden kann?
    Ich bräuchte dann auch Beispiele dazu...
    Danke für die schnelle Antwort.
    Leider klappt der BeispielCode bei mir nciht.
    Dort steht auch, man muss folgendes davor machen:

    • Instanziierung der Graphics3D-Klasse und Übergabe der Zeichengröße
    • Festlegen der World-, View-, und Projection-Matrizen (wer schon einmal mit DX gearbeitet hat, sollte das kennen)

    Ich hab nur keine Ahnung wie :/
    Vermutlich so. Habs aber nicht getestet.

    VB.NET-Quellcode

    1. ' Initialisierung der Graphics3D-Instanz und der Matrizen
    2. Sample_Graphics = New Graphics3D(Me.ClientSize)
    3. Sample_Graphics.Transform_World = Matrix.Identity
    4. Sample_Graphics.Transform_View = Matrix.Translation(0, 0, -5)
    5. Sample_Graphics.Transform_Projection = Matrix.Projection(Math.PI / 4, Me.ClientSize.Width / Me.ClientSize.Height, 0.1, 1000)
    Warum eig. GDI+? Klar geht das, aber das ist doch lang nicht so performant, wie z. B. DirectX. Und mit 'nem anständigen Wrapper wie SharpDX lässt sich das ja implementieren. Dann ist's im Endeffekt auch nur noch Mathematik, die Du hier mit den Matrizen genauso brauchst.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    keine besonderen Modelle bzw. keine Detailierte Modelle...
    Z.B. würden mir schon Würfel, Dreiecke oder so, fürs erste, reichen.
    Mit was ich das mach, ist mir eigentlich egal. Ich sollte es nur ein bisschen verstehen und eben anwenden können ^^
    Ich konnte ein bzw. alle Beispiele nicht starten/anwenden.
    ANch nem Neustart funktioniert nun das beispiel ^^

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Explicit On
    2. Imports opentk
    3. Imports opentk.Graphics
    4. Imports opentk.Graphics.OpenGL
    5. Imports System.Drawing
    6. Imports System.Drawing.Imaging
    7. Imports System.Windows.Forms
    8. Public Class GLTexturedCube
    9. Inherits GameWindow
    10. Protected angle As Single
    11. Protected textures(1) As Integer
    12. Public Sub New()
    13. MyBase.New(468, 360, GraphicsMode.Default, "Textured Cube with OpenTK")
    14. End Sub
    15. Protected Sub LoadTexture(ByVal textureId As Integer, ByVal filename As String)
    16. Dim bmp As New Bitmap(filename)
    17. Dim data As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height),
    18. System.Drawing.Imaging.ImageLockMode.ReadOnly,
    19. System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    20. GL.BindTexture(TextureTarget.Texture2D, textureId)
    21. GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba,
    22. bmp.Width, bmp.Height, 0, OpenGL.PixelFormat.Bgra,
    23. PixelType.UnsignedByte, data.Scan0)
    24. bmp.UnlockBits(data)
    25. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, TextureMinFilter.Linear)
    26. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, TextureMagFilter.Linear)
    27. End Sub
    28. Protected Sub LoadTextures()
    29. GL.GenTextures(textures.Length, textures)
    30. LoadTexture(textures(0), "texture.png")
    31. End Sub
    32. Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    33. MyBase.OnLoad(e)
    34. GL.ClearColor(0.5, 0.5, 0.6, 0)
    35. GL.Enable(EnableCap.DepthTest)
    36. GL.Enable(EnableCap.Texture2D)
    37. LoadTextures()
    38. End Sub
    39. Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
    40. MyBase.OnResize(e)
    41. ' TODO: Perceber melhor sobre o glViewport()
    42. GL.Viewport(0, 0, Me.Width, Me.Height)
    43. Dim aspect As Single = CSng(Me.Width) / Me.Height
    44. Dim projMat As Matrix4 = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect, 0.1, 100.0)
    45. GL.MatrixMode(MatrixMode.Projection)
    46. GL.LoadMatrix(projMat)
    47. GL.MatrixMode(MatrixMode.Modelview)
    48. GL.LoadIdentity()
    49. End Sub
    50. Protected Overrides Sub OnRenderFrame(ByVal e As opentk.FrameEventArgs)
    51. MyBase.OnRenderFrame(e)
    52. GL.Clear(ClearBufferMask.ColorBufferBit Or ClearBufferMask.DepthBufferBit)
    53. GL.LoadIdentity()
    54. GL.Translate(0, 0, -5)
    55. GL.Rotate(angle, 0, 1, 1)
    56. 'GL.Rotate(angle, 0, 1, 0)
    57. GL.Rotate(angle, 1, 0, 0)
    58. GL.Rotate(angle, 0, 1, 0)
    59. GL.Rotate(angle, 0, 0, 1)
    60. angle += 1
    61. GL.BindTexture(TextureTarget.Texture2D, textures(0))
    62. GL.Begin(BeginMode.Quads)
    63. ' Face frontal
    64. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(-1, 1, 1)
    65. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(1, 1, 1)
    66. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(1, -1, 1)
    67. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(-1, -1, 1)
    68. ' Face traseira
    69. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(1, 1, -1)
    70. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(-1, 1, -1)
    71. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(-1, -1, -1)
    72. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(1, -1, -1)
    73. ' Face lateral direita
    74. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(1, 1, 1)
    75. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(1, 1, -1)
    76. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(1, -1, -1)
    77. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(1, -1, 1)
    78. ' Face lateral esquerda
    79. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(-1, 1, -1)
    80. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(-1, -1, -1)
    81. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(-1, -1, 1)
    82. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(-1, 1, 1)
    83. ' Face de cima
    84. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(-1, 1, -1)
    85. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(1, 1, -1)
    86. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(1, 1, 1)
    87. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(-1, 1, 1)
    88. ' Face de baixo
    89. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(-1, -1, -1)
    90. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(-1, -1, 1)
    91. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(1, -1, 1)
    92. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(1, -1, -1)
    93. GL.End()
    94. SwapBuffers()
    95. End Sub
    96. Public Shared Sub Main()
    97. Dim d As New Form1
    98. d.Show()
    99. Dim app As New GLTexturedCube
    100. app.Run(60, 60)
    101. End Sub
    102. End Class



    Damit wird das "GameWindow"-Fenster erstellt/geöffnet und darauf gezeichnet.
    Ich frage mich, wie (/Ob) ich das nun in/auf einer vorhandenen WindowsForm machen kann?
    Theoretisch ja, die Frage ist nur, bist du dir sicher, dass du das in WinForms machen willst.
    Eigt. würde man soetwas alles in OGL machen und Windows komplett außen vor lassen. Außnahmen mögen dabei vlt. MapEditoren und ähnliches sein. Aber selbst da ist es nicht unbedingt die beste Entscheidung.

    Also erstmal, warum überhaupt in WinForms?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Nein, da heißt es selbst programmieren oder nach Libraries suchen.
    opentk.com/doc/chapter/2/glcontrol
    Das hier wäre die einzig sinnvolle Lösung, aber es dürfte wahrscheinlich nicht sonderlich gut funktionieren, wenn du Controls über das RenderControl setzt, da die Windows Controls dann vmtl. von OpenGL überzeichnet werden.
    Wenn du ein Spiel machen möchtest, dann ist das einzig sinnvolle WinForms weg zu schmeißen und alles selbst zu machen, bzw. eine Library zu verwenden.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Möchtest Du wiiiiirklich nicht etwas verwenden, was auf 3D ausgelegt ist?
    Das zum Beispiel?:
    CAD Software mit .Net + GDI+
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner also OpenTK ist sehr gut auf 3D ausgelegt und mMn ggü DX und WPF auch die bessere Wahl. Etwas das beabsichtigt nur für eine Plattform gemacht wird hat denke ich wenig Zukunft.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---