2011-07-18 12 views
6

Jak mogę korzystać z widoku 3D wewnątrz WinForms?3D w WinForms?

Czy powinienem używać XNA?

znalazłem ten samouczek: http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1

Ale ja nie rozumiem, w jaki sposób można dodać tylko ContentLibrary i zawartość do mojego projektu WinForms.

A może używać Scaleform GFx? dla Half2D lub 3D?

+0

Próbowałem tego z kilkoma innymi z powrotem w XNA 2.0 i ogólnie było przekonanie, że nie było to możliwe i nadal działa wejście w WinForms, ponieważ XNA go zahaczył i nie przekazał danych lub coś takiego. Jestem zainteresowany, czy to się zmieniło z 4.0. –

+1

Jaki rodzaj 3D? WPF może być inną opcją. –

+0

@ Xeon06: teraz jest dobrze. –

Odpowiedz

5

Użyj WPF. Możesz łączyć ze sobą formularze. WPF ma kontener WinForm, który można upuścić w oknie i wypełnić go.Ale możesz używać WPF po wyjęciu z pudełka z niewielkim wykształceniem - wskazówka = spraw, aby okno o stałym rozmiarze lub rozmiarze zmieniło twoje sterowanie. Robienie tego dobrze jest trudne.

Następnie umieść panel wpf do zdjęcia, w którym chcesz 3D. Wytnij i wklej kod 3d wpf z Internetu.

7

Polecam używanie kontrolki GL OpenTK - OpenTK WinForms control. Jest to platforma wieloplatformowa, łatwa w użyciu i oparta na OpenGL; który jest wieloplatformowy i zgodny z Mono. Aby to działało, nie są wymagane żadne "hacki". Jest to bardzo prosty sposób osadzania treści 3D w kontenerze WinForm. OpenTK jest objęty licencją LGPL, co oznacza, że ​​możesz ją osadzać w aplikacjach komercyjnych. OpenTK/OpenGL działa obecnie na systemach Linux, Mac i Windows i jest najłatwiejszą metodą osadzania treści 3D w aplikacji .NET lub Mono. Próbowałem XNA w metodzie WinForms i okazało się, że jest nieco mylące, a nie na wiele platform. Następnie wydali XNA 4, a moje poprzednie aplikacje XNA nie były wcale kompatybilne z nową wersją. Ten problem nie występuje tak często w OpenGL, jak w DirectX.

+0

Które rozszerzenia modeli 3D mogę użyć w tym celu? – Danpe

+0

Na stronie OpenTK znajduje się program ładujący OBJ, a ja stworzyłem zmodyfikowany moduł ObjLoader z wbudowanym wykrywaniem kolizji, który mogłem załadować, jeśli chcesz. Jestem pewien, że istnieją inne formaty, na które można również znaleźć wsparcie w swoich forach. – IDWMaster

+0

Muszę już iść, ale opublikuję mój kod źródłowy ObjLoader około 18:00 (czasu centralnego, USA i Kanady). – IDWMaster

9

Nie można odwołać się do projektu treści XNA bezpośrednio ze standardowego projektu Visual C# (tak jak w przypadku domyślnego szablonu WinForms).

Należy utworzyć projekt XNA "Windows Game Library" (nawet pusty), a następnie użyć opcji "Dodaj zawartość" w projekcie, aby dodać odniesienie do projektu treści XNA. (Szablon do tego nazywa się "Projekt pustej treści".) A następnie dodaj odniesienie do tego nowego projektu biblioteki gier do twojego projektu WinForms.

Alternatywnie nic nie stoi na przeszkodzie, aby utworzyć projekt "gry Windows", a następnie za pomocą "Dodaj formularz" - który doda pusty formularz i wymagane odniesienia do zespołu. Musisz wymienić szablon XNA Game1.cs i Program.cs dla standardowego projektu WinForms (lub zobaczyć, co używa przykład "WinForms 1").

Aby załadować zawartość dynamiczną, sprawdź przykład "WinForms 2".

1

Istnieje kilka bibliotek, z których można korzystać. IDWMaster wspomniał o OpenTK, która jest jedną z opcji (OpenGL, więc twój przebieg może się różnić, nie jestem wielkim fanem).

Jeśli chcesz korzystać z DirectX, tak jak otagowałeś to pytanie, jest jeszcze kilka opcji. Firma Microsoft używała oferty Managed DirectX, która została wycofana na korzyść XNA. SlimDX to bardziej nowoczesne opakowanie bibliotek DirectX, które ujawnia większość funkcji (ale ma pewne koszty wydajności). Dostępna jest również wersja SharpDX, która moim zdaniem powinna być nieco szybsza niż SlimDX, ale jej nie używałem.

Możesz również używać niektórych interfejsów API DirectX bezpośrednio, używając współdziałania COM. C# i .Net obsługują raczej dobre współdziałanie z komponentami COM, w tym z natywnymi. Będziesz musiał obsłużyć znaczną liczbę IntPtr s i może być konieczne ręczne marszałkowanie, ale IDirect3DDevice nie ma zbyt wielu metod, które mogłyby spowodować problemy (IIRC).