Admin đã trở lại và lợi hại gấp đôi :D

Sun May 18, 2014 1:05 pm by admin_huyetsat

Sorry mọi người vì mình vắng mặt quá lâu, mình là HuyetSat, admin đây.

Hiện tại mình đã chuyển nền tảng phát triển game sang mobile (dùng libgdx framework) và cũng đang dev game và up lên play store, ai dùng đt android thì tải về ủng hộ ad nha:

play.google.com/store/apps/developer?id=Top+Game+Free

[img]…

[ Full reading ]

Comments: 1

Game4V và Event "Viết bài hay, nhận ngay quà tặng"

Mon Feb 20, 2012 11:18 pm by noheart91

Game4V là một trong những cộng đồng game thủ đầu tiên của Việt Nam với lịch sử hơn 5 năm hình thành và phát triển. Sau nhiều biến động, có thể nói hiện nay G4V là một cộng đồng game hoạt động hoàn toàn độc lập, không bị ảnh hưởng bởi tổ chức chuyên nghiệp nào với nền tảng máy chủ được trang bị từ …

[ Full reading ]

Comments: 0

cho minh tham gia lam game

Sat Sep 03, 2011 8:56 am by nvtu553

cho minh đăng kí 1 chổ nha;minh muốn dăng kí làm code
thanks,

Comments: 0

Mình sẽ tạm dừng hoạt động một thời gian

Fri Sep 02, 2011 7:19 am by HuyetSat

Vì lý do cá nhân nên tạm thời mình sẽ ko support xna trên các diễn đàn nữa.

Bạn nào gặp vấn đề về xna cứ mail trực tiếp cho mình.
thanh_vinh648@yahoo.com

Thân

Comments: 0

xin cho minh tham gia voi

Fri Apr 15, 2011 12:35 am by luongthanhbinh3824

Mình giỏi 3ds max có thể cho mình làm designer được không anh HuyetSat
Email: thanh_binh3824@yahoo.com
Phone: 0633703673

Comments: 1

Latest topics
» Xin TUT game bắn trứng khủng long
by anhkhoa2110 Mon Mar 16, 2015 4:29 pm

» xna getRGB texture image?
by bachdienquan Thu Feb 05, 2015 8:34 am

» Cần giúp đỡ về hiệu ứng hình ảnh khi va chạm
by phiemltv Fri Nov 28, 2014 12:20 pm

» Cho mình hỏi về boundbox
by septimus2810 Mon Jul 21, 2014 10:08 am

» Hỏi về cách di chuyển 1 điểm ở tọa độ này sang tọa độ khác cho trước.
by septimus2810 Mon Jul 21, 2014 10:02 am

» Admin đã trở lại và lợi hại gấp đôi :D
by konamij Fri Jun 27, 2014 2:50 pm

» lỗi An unhandled exception of type 'System.NullReferenceException'
by _VH_HV_ Mon Jun 16, 2014 1:59 pm

» networking cho game xna 2d
by admin_huyetsat Tue May 20, 2014 1:04 pm

» hướng dẫn traning C# chuẩn bị cho xna
by lqchinh Tue Apr 15, 2014 11:31 pm

» HelpGameBom2D
by thaimavn Mon Mar 24, 2014 10:35 am

» Hỏi về cách di chuyển 1 điểm ở tọa độ này sang tọa độ khác cho trước.
by bocapzz Mon Feb 24, 2014 10:45 pm

» Hỏi về cài đặt XNA game studio 4.0
by bocapzz Sat Dec 14, 2013 12:33 am

» Cuộc thi lập trình game thế giới 2013 với cơ hội thăm quan Phần Lan
by viope Tue Oct 29, 2013 4:51 pm

» chơi game làm bởi xna như thế nào?
by thinnhph01957 Sat Sep 14, 2013 3:23 pm

» Với 1 Game cái gì là quan trọng ?
by qhhqnavy Tue Aug 13, 2013 8:09 am

» Load fiel .fbx vào Xna bị mất màu
by qhhqnavy Wed Aug 07, 2013 7:42 pm

» Help me hàm Update và Draw với
by sieuthi Mon Dec 24, 2012 11:56 pm

» Hỏi về load hình chồng nhau trong XNA
by sieuthi Mon Dec 24, 2012 11:49 pm

» nơi ghi danh tham gia Game Development Team
by echdonghop Fri Dec 21, 2012 1:56 pm

» tài liệu cơ bản 5 chương cho xna
by Nelson Quang Thu Nov 22, 2012 12:26 pm


Các Khái Niệm Cơ Bản

Go down

Các Khái Niệm Cơ Bản

Bài gửi by HuyetSat on Sat Apr 03, 2010 6:20 pm

1.Hệ trục tọa độ Oxyz:

Trục tọa độ Oxyz gồm một gốc tọa độ (0,0,0) và 3 trục tọa độ x y z đôi một vuông góc với nhau. Theo mặc định thì XNA sử dụng hệ trục tọa độ bàn tay phải, nghĩa là trục y huớng lên trên trục x hưóng từ trái qua phải và z co huớng tiến ra ngoài màn hình theo chiều duơng của mỗi trục, Điều đó có nghĩa để tiến vào không gian 3D xuyên qua màn hình, chúng ta phải có tọa độ z là âm (-) và giảm dần.
Khi bạn đăt object mà không thiết lập thêm cho nó, mặc định nó sẽ nằm ở gốc tọa độ và có góc nằm trong MP Oxz là 0. nó sẽ huớng ra ngoài màn hình, khi bạn tăng giá trị góc lên (tính theo radian nha) thì object sẽ xoay ngược chiều kim đồng hồ. Chúng ta có thể thiết đặt cho object mà không dùng như mặc định thông qua WorldMatrix của nó, xem các phần sau để biết thêm về Matrix này!

2.Ma trận

Bạn có vị trí của một object là một Vector3 (một kiểu dữ liệu mà XNA định nghĩa sẵn là một nhóm 3 biến kiểu float và để chỉ 3 giá trị hay đi đôi với nhau, ví dụ như tọa độ chỉ vị trí của Object). khi muốn biên đổi vị trí object ta có thể cộng thêm vào giá trị của vector3 đó. Tuy nhiên khi chúng ta muốn xoay object theo các trục của nó hay của Không gian 3D thi việc biến đổi Matran lại rất phức tạp, chúng ta phải tìm 1 giá trị nhất định để nhân cho WorldMatrix (sau này bạn sẽ thấy mỗi object đều đc biến đổi dựa trên Matrix này). Việc tìm ra những giá trị đó thực sự rất khó khăn, do đó để đơn giản hóa XNA cung cấp cho bạn rất nhiều method của lớp Matrix mà từ đó bạn có thể biến đổi object dễ dàng!
Ma trận (Matrix) là căn bản cho mọi biến đổi trong không gian 3D, chúng ta sử dụng nó để biến đổi object (di chuyển, xoay, thay đổi tỉ lệ) và sử dụng effect cũng như lập trình camera và tạo hình chiếu phối cảnh
Bạn có thể sử dụng các method quan trọng:
CreateRotationM : xoay object quanh trục M (là x, y hay z)
CreateTranSlate (vector3) : di chuyển object đến vị trí vector3
CreateScale(f,f,f): thay đổi tỉ lệ kick thuớc object theo 3 trục tọa độ (làm nó to ra hay bé lại, tròn hay méo... )
Transform: Biến đổi với Quaternion
...
Giả dụ ta có thể khai báo worldMatrix như sau:
Code:
Matrix worldMatrix = Matrix.CreateScale(0.01f,0.01f,0.01f)*Matrix.CreateRotationX(Math.PI/4)*Matrix.Translate(Vector3.Zero);

3.Vertex

Vertex là một điểm đc định vị (ko có thể hiện nào mà cho chúng ta nhin thấy) trên không gian 3D, thưòng chúng ta ko draw vertex mà chỉ khai báo tọa độ cho nó, sau đó nối các điểm vertex lại với nhau và Draw các đg thẳng hay hình tam giác đc tạo ra từ vertex.
Hình tam giác, đg thẳng và điểm là 3 Đối tuợng hình học qua trọng nhất vì từ chúng bạn có thể tạo ra bất cứ hình học không gian nào (hình cube tạo từ 12 tam giác chả hạn)
Vertex có thể chứa màu và texture.
Vertex khi đc tạo luôn có tọa độ, do đó ta lưu nó ở dạng Vector3 có sẵn của XNA. Vector3 có nhiều Shortcut như Vector3.One = (1,1,1); Vector3.Up = (0,1,0)... và có nhiều method như
Distance: Tính khoảng cách giữa 2 vector3
Clamp: luôn bó buộc vector3 trong 1 khoảng nhất định về giá trị
...
Ngoài ra còn có các phép cộng trừ nhân chia trên vector3 rất đầy đủ
Cái để vẽ thứ tạo ra bởi các vertex là GraphicDevice, các bạn tạo ra instant cho lớp này và lấy tên cho nó là device chả hạn, khi Draw chúng ta viết như sau:
Code:
device.DrawPrimitives(PrimitiveType.LineList, 0, 11);
nó có nghĩa là chúng ta vẽ 11 đg thẳng theo một nhóm vertex đã đc định nghĩa trước bắt đầu từ điểm [0] vì nhóm vertex ở đây là 1 mảng.

4.Indices - Vertex Buffer

Chúng là các điểm lưu giữ các vị trí của vertex, chính xác là 1 indices lưu giá trị của một hay nhiều vertex. Vì quá trình xử lý vertex buộc chúng ta phải trích xuất tài nguyên từ RAM sang Card graphic nên sử dụng indices sẽ ngăn ngừa đc tình trạng trên nên máy chạy nhanh hơn. Tất nhiên Indices là không bắt buộc. Ngoài ra khi có nhiều vertex trùng nhau thì sử dụng indices sẽ làm gọn chuơng trình.
Tập hợp các indices ta gọi là Vertex Buffer, đc xem như cái nâng đỡ cho hệ thống vertex của chúng ta

5.Basic Model
Chúng ta ko thể dùng vertex để draw mọi thứ trong game, có những thứ rất phức tạp mà phải cần đến các 3D tools (3DSM, Maya... ) để tạo ra các mô hình 3D (model). XNA sẽ sử dụng các model này (như hình nguời, cây cối... ) làm sprite hay dùng chúng đê tạo ra không gian trong game (skyBox).
Model mà XNA có thể sử dụng là FBX và X. ngoài ra XNA có thể sử dụng nhiều loại model khác nhau nếu chúng ta tạo thêm các bộ xử lý cho Content của XNA
Mesh là một mảng (miếng) của một model, nghĩa là nếu ta chắp các mesh lại với nhau thì đc 1 model hoàn chỉnh. Các mesh đc định nghĩa bởi người làm đồ họa, nói chung với dân coder như chúng ta thì ko rành cũng chả sao. Có điều bạn cần biết chỗ nào ghi lại các mesh, khi open rùi, bạn fìnd với từ khóa là "mesh" hay với "Object relations", bạn sẽ thấy danh sách tất cả các mesh của model. Có thể model chỉ có 1 mesh như model cái que chả hạn, cũng có thể có nhiều mesh, khi đó chúng ta sẽ có 1 cách để code hoạt hình cho model (code rieng cho tung Mesh)
Bone cũng là thành phần của model, nó là những cái "xuơng" giông như khung xưong nguời nâng đỡ cho cơ thể chúng ta vậy. một model co 1 cái xuơng gốc (rootbone) và điểm cuối của mỗi bone là bắt đầu của 1 hay nhiều bone mới, do đó cũng sẽ có xuơng cụt (endbone) nơi kết thúc của bones. Khi bên đồ họa làm model, họ có thể làm hoạt hình cho model đó bằng cách điều khiển các bone, chúng ta có thể cải tiến Content Process của XNA để sử dụng loại hoạt hình này
Hiện tại các model có thể open đc bằng notepad, đó là Ascii model. Loại này rất tiện lợi khi lập trình vì nó cho ta các thông tin hữu ích ở trên. Nếu bạn nhận đc binary Model (không mở đc bởi notepad) => yêu cầu nhóm làm đồ họa của bạn convert lại Very Happy
Chúng ta sẽ sử dụng model đơn giản hình cube, nhiệm vụ của chúng ta là Đưa nó lên màn hình:
Thói quen tốt khi lập trình là khai báo biến truớc khi viết method, chúng ta khai báo model:
Model myModel;
Trong method LoadContent, load cho nó cái model cube:
myModel = Content.Load<Model>("Cube");
Chúng ta Draw từng mesh trên model:
foreach (ModelMesh mesh in myModel.Meshes)
{
// Draw the current mesh
mesh.Draw();
}
Xong rùi đó, model Cube đã đc đưa lên, tuy nhiên nó nằm theo huờng mặc định của XNA, hưóng vào trong màn hình, vị trí tại gốc tọa độ cho nên nó hoàn toàn giống một hình 2D (bạn chỉ nhìn thấy 1 mặt của hình cube theo cách Draw trên. Để có tính 3D chúng ta cần thuộc tính ánh sáng của BasicEffect và dùng các method của Matrix có tác dụng xoay object để nhìn rõ đc 3 mặt của hình cube ở phần duới đây

6.BasicEffect

Đây là hiệu ứng cơ bản mà XNA đã cài sẵn cho bạn sử dụng, nó có nhiệm vụ chính là Draw một model, biến đổi model thông qua WorldMatrix của model đó, thêm một số hiệu ứng về ánh sáng (không có đổ bóng đâu mà nó chỉ hỗ trợ 3 hưóng chiếu sáng tùy chọn thôi) và suơng mù (fog)... Cách sử dụng khá đơn giản bạn chỉ cần thiết lập vài tham số của basicEffect là dùng đc.
VD: Draw một model
LẶp trong tất cả các mesh của model:
foreach (ModelMesh mesh in myModel.Meshes)
{
//Sử dụng basicEffect cho từng mesh
foreach (BasicEffect effect in mesh.Effects)
{
Effect trên tự tạo ánh sáng cho nó theo mặc định, bạn không cần chỉnh lại về 3 huớng sáng nữa (3 hay 2 hay 1 là tùy ý). Đây là method rất tiện lợi dành cho những nguời "luời".
effect.EnableDefaultLighting();
Biến đổi ma trận cho từng mesh, biến đổi chủ yếu dựa vào 3 method của Matrix đã nói đến
effect.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix;
Tạo ma trận cho camera view và hình chiếu phối cảnh, phần tiếp theo sẽ nói
effect.View = ViewMatrix;
effect.Projection = ProjectionMatrix;
}
mesh.Draw();
}
Trở lại với VD phần truớc bạn có thể dùng basic effect để Draw hình cube:
foreach (ModelMesh mesh in myModel.Meshes)
foreach (BasicEffect effect in mesh.Effects)
{
// làm nhỏ và xoay model theo worldMatrix
effect.World = Matrix.CreateScale(0.5f) *
Matrix.CreateRotationX(MathHelper.ToRadians(45.0f)) *
Matrix.CreateRotationY(MathHelper.ToRadians(45.0f));
// Set the projection Matrix for the model
effect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45.0f),
aspectRatio, 1.0f, 10.0f);
effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 3.0f), Vector3.Zero,
Vector3.Up);
effect.EnableDefaultLighting();
}
base.Update(gameTime);
7.Camera

Camera thực sự là con mắt của player khi chơi game. Để tạo một camera bạn cần Matrix sử dụng method CreateLookAt, method cần các tham số để hoạt động:
Position: vị trí đặt camera
Target: điểm mà camera luôn huớng đến
Vector3Up: một vector luôn đc camera hiểu là vector đó huớng lên trên, thuờng chúng ta chọn Vector3.Up => trục Y huớng lên trên, nếu bạn chọn Vector3.Right (1,0,0) thì trục X sẽ huớng lên trên theo quan sát của camera mà bạn lập trình.
Khi đó
Matrix viewMatrix = Matrix.CreateLookAt(Position, Target, VectorUp);
8.Hình chiếu phối cảnh

Hình chiếu phối cảnh ,để tạo chúng ta sử dụng Method sau của Matrix:
Matrix.CreatePerspectiveFieldOfView
//Tạo cảnh nhìn
this.viewPort = viewPort;
Chúng ta cần biến này bởi nó sẽ cung cấp cho ta viewPort.AspectRatio là tỉ lệ giữa chiều dài và chiều rộng theo cảnh nhìn của chúng ta. Nếu bạn ko biết tỉ lệ này trên thiết bị của bạn , thuộc tính trên là rất hữu ích
//Góc lệch tính theo huớng hình thẳng
float viewAngle = MathHelper.PiOver4;
//Cảnh cận mắt, khoảng cách gần nhất với camera chúng ta nhìn đc
float nearPlane = 0.5f;
//cảnh xa mắt, khoảng cách xa nhất với camera mà chúng ta nhìn đc
float farPlane = 1000.0f;
//Đây là cái đưa vào basicEffect
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(viewAngle, viewPort.AspectRatio, nearPlane, farPlane);


Giá trị FarPlane cần phải cẩn trọng nếu bạn muốn nhìn thấy những cảnh ở xa
9.Vẽ một hệ trục tọa độ

Để vẽ một hệ trục tọa độ để dễ quan sát các object khác trong không gian 3D thông qua các vertex, chúng ta làn luợt thực hiện các buớc :
-Định nghĩa các điểm vertex là khung cho hệ tọa độ (mũi tên của mỗi trục, gốc tọa độ... )
-Viết chúng trong một mảng gọi là vertices.
-Sử dụng basic effect để duyệt từng thành phần (pass) của chính nó, lấy effect có thể Draw các vertex.
-Vẽ các vertex trong mảng theo đuờng thẳng


10.Sử dụng Effect tùy chọn

Basiceffect thực sự là một effect. Tuy nhiên bạn có thể sử dụng thêm effect ở ngoài để phục vụ cho mục đích của bạn. VD như shadow, blur... những cái này basicEffect ko có nhưng bạn có thể có những effect này bằng cách down xuống các file fx hay tự viết effect = NNLT "HLSL" hiện đại hơn, bạn có thể dùng FX composer của Nvidia.
Các buớc để sử dụng effect như sau:
-Khai báo thể hiện của lớp Effect sẵn có của XNA
-Load nó vào ở Method LoadContent
-Nếu cần xử lý các Thuộc tính của effect, có thể đặt nó ở Update hay Initilize Method. Các bạn có thể xem tên các technique và property của effect trong chính file fx. Mở = notepad hay codeView của Visual Studio
-Ở Draw Method, chúng ta gọi các technique của effect hay các Thuộc tính có liên qua đến quá trình diễn ra effect. Gán cho chúng những giá trị phù hợp. Draw cũng luôn đc như Update Method => effect và các code để Draw object cũng liên tục đc thể hiện trên màn hình!
Quaternion

Đây là một đại lượng có thể dùng thay cho Matrix.CreateRotationM trong khi biến đổi object hay khi nó dùng cho trường hợp bạn muốn xoay một object quanh 1 object khác! Từ lúc bắt đầu chúng ta mới thảo luận về việc cho object xoay quanh các trục tọa độ của không gian và của chính bản thân object, bây giờ để thực hiện quay một object quanh 1 object khác, bạn cần xác định vector mà object sẽ quanh xung quanh (VD như bạn muốn earth xoay quanh vectorUp của sun (cái SunWorldMatrix.Up sẽ cho bạn cái vectorUp của Sun ) một góc (float)pi nào đó:
//UpVector cần chuyển sang vector đơn vị vể dùng cho quaternion
Upvector.Normalize();
Code:
Quaternion rorate = Quaternion.CreateFromAxisAngle(Upvector, 0.05f);
Khi đó , vị trí của earth sẽ đc thay đổi như sau:
position = Vector3.Transform(position, rorate);
Đưa nó vào EarthWorldMatrix, Earth sẽ quay quanh sun!


Được sửa bởi HuyetSat ngày Sat Apr 10, 2010 6:33 pm; sửa lần 2.
avatar
HuyetSat
Administrator

Tổng số bài gửi : 167
Điểm : 1291
Danh Tiếng : 19
Join date : 30/03/2010
Đến từ : Microsoft

Xem lý lịch thành viên http://xvna.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết