Archive for January, 2011

XNA + Modele 3D = Blender

Dziś postanowiłem podzielić się swoimi początkami jeżeli chodzi o platformę XNA oraz wykorzystanie modeli 3D. Na rynku mamy wiele programów do modelowania 3D, natomiast jednym z popularniejszych, a dodatkowo bezpłatnych programów jest Blender. Aktualnia stabilna wersja to 2.49b i to właśnie ona posłuży nam do przygotowania i wyeksportowania modelu.

Wersja podstawowa

Uruchamiamy zatem Blendera (wymagany jest w tym zainstalowany Python 2.6). Widzimy domyślny układ okna, na którym znajduje się sześcian, lampa i kamera. Do XNA będziemy eksportować pojedyncze modele, zatem pozbywamy się kamery i lampy, lub usuwamy wszystko (klawisz A, następnie Del) i dodajemy sześcian na nowo (Spacja -> Add -> Mesh -> Cube). Co do samego modelu pozostawiam wam pole do popisu. Ja w tym momencie pozostanę przy sześcianie :)

XNA potrafi korzystać z modeli zapisanych między innymi w formacie FBX. Blender w ostatniej stabilnej wersji wspiera eksport do takiego właśnie formatu. Jezeli korzystacie z jakiejś starczej, to również nie ma problemu, gdyż istnieją gotowe skrypty, które umożliwiają eksport do takiego właśnie formatu.
Klikamy zatem Menu File -> Export -> Autodesk FBX (.fbx). W tym momencie nie korzystamy z animacji, zatem możemy odznaczyć pole Enable Animation, a następnie zapisujemy plik na dysku.

Aby móc skorzystać z tak wyeksportowanego modelu w XNA najpierw musimy stworzyć projekt. W tym celu skorzystamy z szablonu Windows Game. Równie dobrze można skorzystać z projektu dla Windows Phone 7. Jedyna różnica jaka tu będzie, to inne współrzędne dla ustawień kamery, ale ich dopasowanie nie jest problemem.


W przeciwieństwie do wcześniejszych wersji XNA mamy tu do czynienia z oddzielnym projektem.


Dla zachowania porządku dodajemy sobie katalog Models, do którego następnie dodajemy wyeksportowany przed chwilą obiekt w formacie fbx.
Teraz pora na kawałek kodu. W pliku Game1.cs dodajemy zmienne:

1
2
3
private Model _model;
float aspectRatio;
Vector3 cameraPosition = new Vector3(10.0f, 10.0f, 10.0f);

W metodzie LoadContent musimy zainicjować ww zmienne w taki oto sposób:

1
2
_model = Content.Load<Model>("Models/sampleModel");
aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;

Teraz przechodzimy do metody Draw, która jest odpowiedzialna za idświeżanie widoku. Naszym zadaniem jest narysowanie każdej powierzni po uwczesnym nadaniu jej odpowiednich wartości oświetlenia i projekcji. Gotowy kod wygląda następująco.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// Draw the model.
foreach (ModelMesh mesh in _model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.View = Matrix.CreateLookAt(cameraPosition,
Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(20.0f), aspectRatio,
1.0f, 50.0f);
}
 
mesh.Draw();
}
 
base.Draw(gameTime);
}

W tym momencie jesteśmy gotowi do uruchomienia projektu, którego efekt powinien prezentować się jak na poniższym screenie:

Scena jest trochę statyczna, więc możemy jeszcze dodać rotację. W tym celu tworzymy dodatkową zmienną, która będzie przechowywała aktualny kąt obrotu (float modelRotation) oraz uaktualniamy ją w metodzie Update:

1
modelRotation += (float)gameTime.ElapsedGameTime.TotalMilliseconds * MathHelper.ToRadians(0.1f);

Teraz w metodzie Draw dodajemy kod odpowiedzialny za zaaplikowanie odpowiedniego obrotu (na przykład względem osi OY). Pamiętajmy, że XNA to świat macierzy, dlatego korzystamy z takiego kawałka kodu:

1
effect.World = Matrix.CreateRotationY(modelRotation);

Jeżeli chcemy zastosować więcej obrotów musimy przemnożyć przez siebie odpowiednie macierze. Teraz po uruchomieniu projektu nasz sześcian ożył :)

Teksturowanie

Jednolite obiekty to nie jest szczyt marzeń, dlatego przydałoby się wykorzystać jakąś teksturę. Tutaj sprawy się nieznacznie komplikują. Tak jak w kwesti modelowania i eksportowania modeli ze standardowymi materiałami nie ma tu większej magii, tak w przypadku wykorzystywania tekstur są pewne (czasem spore) różnice w każdej wersji Blendera. W internecie można znaleźć różne posty, jednakże nie wpadł mi w ręce żaden odpowiadający tej właśnie wersji. Zatem metodą prób i błędów z małą pomocą dokumentacji przedstawiam kolejne ktoki, jakie musimy podjąć aby przygotować taki model.

  • Tworzymy w blenderze nowy projekt.
  • Dodajemy sześcian
  • Dzielimy ekran na dwie części
  • Przenosimy się do trybu Edit
  • W zakładce Editing (F9) wybieramy UV texture -> New
  • W jednej z części zostawiamy widok 3D, a w drugiej przełączamy się na UV/Image Editor
  • Przełączamy się w tryb edycji powierzchni i Wybieramy jedną z nich.
  • Wybieramy plik graficzny, który ma być teksturą danej powierzchni
  • Przełączamy w tryb Textured, dzięki któremu mamy podgląd tego co zrobiliśmy

Analogiczne operacje wykonujemy dla kolejnych powierzchni (w tym przypadku dla ścian sześcianu). Jeżeli zaznaczymy kilka wówczas załadowanie pliku graficznego spowoduje, że zostanie on wczytany dla wszystkich ścian.

Teraz czas zapisać pracę i ponownie wyeksportować model do formatu fbx, który następnie przenosimy do projektu. Jest jednak jedna rzecz, którą musimy zmienić. W pliku modelu mamy zapisane informacje o teksturach w postaci relatywnych ścieżek. Musimy je pozmieniać na odpowiednie wartości. Jednocześnie w projekcie tworzymy katalog Textures, do którego przenosimy wykorzystane przez nas tekstury. Otwieramy plik FBX przy pomocy edytora tekstowego (notatnik, lub dwuklik w Visual Studio) i wyszukujemy wystąpień RelativeFilename a następnie je uaktualniamy:
RelativeFilename: “..\Textures\sampleTexture.png” oraz RelativeFilename: “..\Textures\sampleTexture2.png” Teraz po wykorzystaniu nowego modelu możemy się cieszyć sześcianem z teksturami.

To koniec. Analogicznie postępujemy z bardziej złożonymi obiektami i teksturami, dzięki czemu dużo łatwiej możemy tworzyć niesamowitą grafikę na platformie XNA przy użyciu intuicyjnego programu do modelowania jakim jest Blender.

Projekt do pobrania.


Nowy NHibernate na TGD.NET

Toruńska Grupa Deweloperów .NET ma przyjemność zaprosić na 25 spotkanie, które będzie miało formę warsztatów. Łukasz Dams przedstawi nam najnowszą odsłonę NHibernate.

O czym będzie:
Z okazji premiery trzeciej już odsłony NHibernate, chciałbym przybliżyć uczestnikom ten popularny ORM i sposoby jego praktycznego wykorzystania. Osoby posiadające już doświadczenie z NHibernate, będą mogły dowiedzieć się o nowościach, jakie zostały udostępnione w wersji trzeciej, oraz o wielu mało znanych, ale przydatnych funkcjonalnościach dostępnych w wersjach wcześniejszych.
Agenda:

  1. Krótki wstęp do frameworka i jego konfiguracji.
  2. Obiektowy model domeny vs. relacyjna baza danych – czyli (prawie) cała prawda o mapowaniach .
  3. Transakcje – jak z nich korzystać, optymistyczne i pesymistyczne rozwiązywanie transakcji, integracja z TransactionScope.
  4. QueryOver – nowy, szybki i wygodny sposób tworzenia zapytań, nietrywialne przykłady użycia.
  5. Przegląd dostępnych API interakcji z bazą danych – wady, zalety i ograniczenia, dobór właściwego narzędzia do zadania.
  6. Optymalizacje na poziomie mapowań i zapytań, najczęściej popełniane błędy.
  7. Wzorce i antywzorce użycia.
  8. Przykłady wykorzystania wbudowanego modelu zdarzeń i interceptorów.
  9. Bardzo krótkie porównanie z Entity Framework i Linq2Sql.
  10. Wybrane rozszerzenia.

O prelegencie:
Łukasz Dams – Absolwent Wydziału Fizyki, Astronomii i Informatyki Stosowanej w Toruniu. Obecnie, starszy programista w toruńskiej firmie AIS.PL, gdzie tworzy aplikacje w ASP.NET MVC. Od roku zaangażowany w projekty intensywnie korzystające z NHibernate. Zainteresowany wszelkimi nowinkami technicznymi w zakresie programowania, architektury aplikacji i wzorców projektowych oraz metodami, i narzędziami optymalizacji operacji bazodanowych.

Z racji na warsztatową formę spotkania liczba miejsc jest ograniczona!!!
Gdzie i kiedy:
Spotkanie odbędzie się 1 lutego od godziny 17:00 w LABOLATORIUM L4 na Wydziale Matematyki i Informatyki UMK (ul. Chopina 12/18) . Wstęp na wykład jest wolny. Rejestracja na spotkanie jest obowiązkowa.
(Link dla osób korzystających z Codeguru: Rejestracja na spotkanie)


WP7 – Silverlight + XNA != InvalidOperationException

Dziś po małej przerwie mała podpowiedź dla osób zajmujących się Windows Phone 7.

Jak wiadomo (lub też nie :) ) platformy, przy pomocy których możemy pisać własne aplikacje na WP7 to Silverlight 4 Windows Phone (nie piszę samego Silverlight, bo są tu pewne różnice w stosunku do pełnej wersji) oraz XNA 4.0. Nie oznacza to jednak, że musimy zamykać się tylko w jednym ze światów. Istnieje możliwość korzystania w jednym projekcie z przestrzeni nazw, klas i funkcjonalności dostępnych w obu tych technologiach. Zapewne najczęstsze “wymieszanie” technologii następuje gdy tworzymy w Silverlight. Dlaczego? Między innymi dlatego, że XNA oferuje nam wiele funkcjonalności multimedialnych takich jak odtwarzanie dźwięków, nagrywanie przy pomocy mikrofonu, MediaPlayera, ale również udostępnia rozpoznawanie gestów przy pomocy TouchPanel (tak – wiem, że Silverlight mamy Silverlight Control Toolkit i GestureListener, ale tak naprawdę jest on nakładką na TouchPanel z XNA :) ).

Tak czy inaczej, może okazać się, że w momencie gdy dodamy do projektu referencję do klas z XNA i będziemy korzystać z zawartych tam obiektów może się okazać, że otrzymujemy błąd widoczny na screenie poniżej, czyli InvalidOperationException, FrameworkDispatcher.Update has not been called.

Dispatcher

Oznacza on tyle, że korzystamy z elementów, które wymagają wywołania metody “odświeżenia stanu XNA” . Aby to zrobić wystarczy użyć takiego oto fragmentu kodu w konstruktorze strony SL:

1
2
3
4
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(33);
dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
dt.Start();

W tym momencie przy uruchomieniu aplikacji błąd ten się nie pojawi. Warto jeszcze zauważyć, że nie ma sensu ustawiać częstszego odświeżania (czyli interwału dla DispatcherTimer), gdyż platforma Windows Phone 7 wspiera maksymalnie 30 klatek na sekundę (co daje odświeżenie do 33 milisekundy), w przeciwieństwie do pełnego XNA, które wspiara standardowo 60 fps.


Windows Phone 7 – porównanie urządzeń

Pewnego dnia siedząc przed komputerem i studiując lekturę dotyczącą Windows Phone 7 trafiłem na porównanie urządzeń pod względem rozmiarów, wagi, baterii, pamięci RAM/ROM itp. Niestety gdy chciałem jeszcze raz sięgnąć do tego zestawienia nie mogłem go znaleźć…
Przypadkiem porównanie ponownie wpadło mi w ręce, a właściwie pojawiło się na moim ekranie i tym razem, zamieszczam je na blogu. Robię to z dwóch powodów:
1 – w razie potrzeby będę wiedział gdzie szukać :)
2 – może komuś też się to przyda, lub kogoś zainteresuje

Windows Phone 7 comparision

Źródła:
ElectricForest
Microsoft News Center


  • O mnie

    Maciej Grabek

    Moje profile na:

    MVP

    Codeguru.pl GoldenLine
    Twitter CodeProject

  • english version
  • Polecam

  • Copyright © Maciej Grabek. All rights reserved.
    Powered by WordPress
    %d bloggers like this: