VietNam XNA game development Community
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.
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


Model và tuơng tác với Model

Go down

Model và tuơng tác với Model Empty Model và tuơng tác với Model

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

Load và Render một model

Chung ta dùng lại camera FPS của chuơng trước, dùng nó để quan sát các model sẽ đc render trong chuơng này.
XNA hỗ trợ rất tốt lập trình OOP của C#, do đó chúng ta sẽ xây dựng lớp cho model của bạn rất tiện.
Code:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;

Mình giải thix một tí: 3 cái using của XNA trên có nghĩa là
- Chúng ta sử dụng DrawableGameComponent, class sẵn có của XNA. Dùng nó rất có lợi bởi lẽ trong Class Game1.cs của chúng ta, XNA đã tạo một mảng có tên Components. Mỗi Đối tượng là GameComponent hay là DrawableGameComponent khi đc Add vào mảng này sẽ đc tự động chạy các method quan trọng như initilize, update (nếu là Drawable thì có thêm Draw method). Nghĩa là nếu bạn tạo ra 100 object kiểu này thì sẽ đỡ công code, chúng ta chỉ cần đưa nó vào mảng Component là xong! Mặt khác sử dụng Class component trên chúng ta còn có 1 tham số quan trọng đó là Game, tức là Game1.cs đó khi XNA tạo sẵn cho bạn lớp Game1.cs có phải nó kế thừa từ Microsoft.Xna.Framework.game. Khi nhập dữ liệu (bằng 1 method trùng tên với tên của class) trong Game1.cs (thuờng ở LoadContent Method). Khi đã có Game trong tay bạn có thể dễ dàng lấy dữ liệu từ Game1.cs truyền cho các GameComponent như dùng camera như Ví dụ của chúng ta.
Khi sử dụng Microsoft.Xna.Framework.GamerServices; nghĩa là chúng lấy khả năng cho phép XNA truyền dữ liệu từ chuơng trình chính (Game1.cs) sang Các gameComponent
Cuối cùng dùng Microsoft.Xna.Framework.Graphics cho phép chúng ta dùng các method của XNA để Draw đối tuợng (cả 2D lần 3D đều cần)
Dưới đây là chi tiết lớp ModelSprite:
Code:
namespace Example
{
    /// <summary>
    /// This is a game component that implements IUpdateable.
    /// </summary>
    public class ModelSprite : Microsoft.Xna.Framework.DrawableGameComponent
    {
//Sẽ lấy thông tin từ Game1.cs
        QuakeCamera fpsCam;
//Model sẽ đc load từ content trong Game1.cs
        Model model;
//Model có nhiều Bone, mỗi bone cần 1 worldMatrix do đó chúng ta tạo 1 mảng
        Matrix[] modelTransforms;
        public ModelSprite(Game game, Model model)
            : base(game)
        {
            this.model = model;
            modelTransforms = new Matrix[model.Bones.Count];
//báo hiệu fpsCam sẽ dùng dữ liệu từ Game1.cs
            fpsCam = Game.Services.GetService(typeof(QuakeCamera)) as QuakeCamera;
        }
        public override void Draw(GameTime gameTime)
        {
            //draw model
            Matrix worldMatrix = Matrix.CreateScale(0.01f, 0.01f, 0.01f);
      //Dùng mảng ma trận cho các bone của model
            model.CopyAbsoluteBoneTransformsTo(modelTransforms);
            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.EnableDefaultLighting();
//Từng Mesh Đc biểu diễn dựa trên Ma trận của bone trong nó và //của ma trận chung của cả model (cái chúng ta hay điều chỉnh)
                    effect.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix;
                    effect.View = fpsCam.ViewMatrix;
                    effect.Projection = fpsCam.ProjectionMatrix;
                }
                mesh.Draw();
            }

            base.Update(gameTime);
        }
    }
}

Bây giờ chúng ta sẽ bổ sung thêm vào Game1.cs. đầu tiên hãy tạo ra fps camera của chúng ta như chuơng trước và khai báo ModelSprite, sau đó thêm câu lệnh sau:
Services.AddService(typeof(QuakeCamera), fpsCam);
fpsCam sẽ đc "share" cho ModelSprite sử dụng
ModelSprite của chúng ta cần đc load, đặt nó sau khi đã thiết lập cho camera, sau đó add nó vào mảng Component:
model = new ModelSprite(this, Content.Load<Model>("tank"));
Components.Add(model);

Bạn không cần code nữa, OOP sẽ làm việc nó cần làm J
Source: http://www.mediafire.com/?wtdljmqonbg
2.Biến đổi Model theo WorldMatrix của Nó!

Cái này mình đã nói sơ rùi, bây h chúng ta sẽ đi sâu vào nó. Bạn đã biết về 3 method quan trọng của Matrix khi dùng nó biến đổi object.
Các Model nói chung đều có 1 worldMatrix để truyền cho basicEffect. Vấn đề của bạn là hiện tại model cũng có 1 hệ trục riêng của nó và hệ trục tọa độ của không gian 3D. khi đó bạn có thể xoay quanh trục nào bạn muốn bằng cách sau:
-Thực hiện theo thứ tự Scale > Rotated > Tránslate => model tự xoay xung quanh nó (theo trục tọa độ của model)
-Thực hiện theo thứ tự Scale > Tránslate > Rotated => model xoay xung quanh trục tọa độ của không gian 3D
=> Matrix ko có tính giao hoán của phép nhân Very Happy
Ngay ca khi xoay ở 1 trục hệ tọa độ, Việc Đặt xoay trục X truớc Y sau hay Y trước X sau cũng làm model biến đổi sang các trạng thái khac nhau, do đó khi biến đổi tốt hơn hết là bạn nên biết bạn muốn làm gì.
2 thứ tự trên của Rotated bạn lồng cho nhau cũng đc (nó sẽ giống như trái đất vừa quay quanh mặt trời vừa quay quanh chính mình J)
Bạn có thể sử dung worldMatrix cho từng loại model bằng cách dùng class riêng cho từng loại, VD như lớp ModelSprite mình xây dựng phần truớc.
Chúng ta có thể xây dựng biến time ghi lại thời gian chạy game => biến đó sẽ tăng dần theo thời gian => nếu time đó là radian (kiểu float) thì góc sẽ tăng dần, dùng với method CreateRorated của Matrix thì Model sẽ cứ xoay vòng vòng theo gameTime! Tương tự chúng ta có thể làm cho vật di chuyển mãi theo cách như thế, tuy nhiên chỉ là demo thôi nhá, nếu bạn viết game thực sự thì phải control cho model hay ít nhất là xây dựng cho nó một game logic.

Model xoay theo hướng di chuyển

Có nghĩa là model đi về hướng nào thì cái "mặt" của nó sẽ đánh về huơng đó, một model hình người ko thể di chuyển với cái mông tiến về trước đc, phải là cái mặt hay ngực mới hợp lý.
VD như sau:
//Update Method:
//time ghi lại thời gian đã chạy game (float)
Vector3 newPos = new Vector3();
//Vận chuyển động theo tính tuàn hoàn của hàm sin, cos
newPos.X = (float)Math.Sin(time)* 10.0f;
newPos.Z = (float)Math.Cos(time / 1.9f) *10.0f;

angle = CalculateRotation(position, newPos, angle);
position = newPos;

worldMatrix = Matrix.CreateTranslation(position);
worldMatrix = Matrix.CreateRotationY(angle) * worldMatrix;
worldMatrix = Matrix.CreateScale(0.005f) * worldMatrix;

Chúng ta lưu lại vị trí mới mà model sẽ chuyển đến, và góc mà model sẽ xoay quanh trục Y (bởi vì nó di chuyển trong Mp Oxz), góc luôn đc Update trước khi chúng ta đưa nó vào worldMatrix

Để Update, bạn cần biết tọa độ cũ, tọa độ mới và nó trả về góc cần xoay như sau:
private float CalculateRotation(Vector3 oldPos, Vector3 newPos, float lastRot)
{
Vector3 direction = newPos - oldPos;
if ((direction.X == 0) && (direction.Z == 0))
return lastRot;
else
//trả về góc cần xoay quanh trục Y
return (float)Math.Atan2(direction.X, direction.Z);
}

Gia tốc cho model

Cái này thiên về việc ứng dụng vật lý cho game chân thực hơn, nghĩa là mọi vật khi chuyển động nếu vận tốc thay đổi thì nó cần 1 thời gian nhất định trước khi đạt đc vận tốc ổn định, trong khoảng thời gian đó gia tốc dương và vận tốc tăng dần. không có cái xe đua nào đưa đc vận tốc từ 0 lên ngay 100km/h cả, nó phải bắt đầu từ 5, 10, 20, 40... rất uyển chuyển
Để tạo ra gia tốc , chúng ta làm như sau:
-Tạo ra model
-Điều khiển KeyBoard cho nó: theo các phím mũi tên (left right là chuyển góc, up down là thay đổi vận tốc:
if (keyState.IsKeyDown(Keys.Up))
forwardReq += 1.0f;
if (keyState.IsKeyDown(Keys.Down))
forwardReq -= 1.0f;
if (keyState.IsKeyDown(Keys.Left))
angleReq += 1.0f;
if (keyState.IsKeyDown(Keys.Right))
angleReq -= 1.0f;
Một Method tính vận tốc và hướng cho model, nó cần vị trí của model, góc của model (trong mặt phẳng Oxz), các thuộc tính điều chỉnh tốc độ và góc , các giới hạn gia tốc, tốc độ và hệ số ma sát
private void Accelerate(ref Vector3 position, ref float angle, ref Vector3 velocity, float forwardReq, float rotationReq, float elapsedTime, float maxAccel, float maxRotSpeed, float friction)
{
Matrix rotMatrix = Matrix.CreateRotationY(angle);
Vector3 forwardDir = Vector3.Transform(new Vector3(0, 0, -1), rotMatrix);

velocity = velocity * (1 - friction * elapsedTime) + forwardDir * forwardReq * maxAccel * elapsedTime;

float forwardSpeed = Vector3.Dot(velocity, forwardDir);
velocity = forwardSpeed * forwardDir;

modelPosition += velocity * elapsedTime;
modelYRot += rotationReq * maxRotSpeed * forwardSpeed;
}
HuyetSat
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

https://xvna.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

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