新建一個工程
加入一個設備對象變量
private Microsoft
添加初始化圖形函數
public void InitializeGraphics()
{
PresentParameters presentParams = new PresentParameters();
presentParams
presentParams
presentParams
presentParams
device = new Microsoft
}
當程序執行時
public void Render()
{
// 清空設備
device
// 設置照相機的位置
SetupCamera();
//開始場景
device
if(meshLoaded)
{
mesh
}
device
//顯示設備內容
device
}
設置照相機的位置
private void SetupCamera()
{
device
device
}
現在改變主函數
[STAThread]
static void Main()
{
using (Form
{
EarthForm
EarthForm
while(EarthForm
{
EarthForm
Application
}
EarthForm
}
運行程序
二
在這一步裡需創建一個
加入一些相關變量
public class Earth : BaseEarth
{
private Material[] mMaterials; //保存材質
private Texture[] mTextures; //保存紋理
private Matrix locationOffset; //用來保存網格對象的相對位置
private Mesh mMesh = null; //三角形網格對象
private Device meshDevice; //需要顯示在哪個設備上
}
在構造函數中
public Earth(ref Device device
{
meshDevice = device;
locationOffset = location;
}
下面這個函數是裝入
public bool LoadMesh(string meshfile)
{
ExtendedMaterial[] mtrl;
try
{
// 裝載文件
mMesh = Mesh
// 如果有材質的話
if ((mtrl != null) && (mtrl
{
mMaterials = new Material[mtrl
mTextures = new Texture[mtrl
// 得到材質和紋理
for (int i =
{
mMaterials[i] = mtrl[i]
if ((mtrl[i]
{
//前面得到的紋理的路徑是相對路徑
mTextures[i] = TextureLoader
}
}
}
return true;
}
catch
{
return false;
}
}
在這個方法內
下面這個Render()方法
public void Render(Matrix worldTransform)
{
/把位置變為世界坐標
meshDevice
//繪制網格
for (int i =
{
meshDevice
meshDevice
mMesh
}
}
現在回到窗體代碼中
private Earth mesh = null;
private Matrix meshLoc;
private bool meshLoaded = false;
在圖形初始化函數中
meshLoc = Matrix
meshLoc
mesh = new Earth(ref device
if (mesh
{
meshLoaded = true;
}
代碼第一句把網格對象的位置定為原點
在設置相機的函數中
device
device
device
device
device
此燈光較簡單
最後
三
前面用一個網格對象來建立地球
在工程中新添加一個類
加入進行平移
private float xloc =
private float yloc =
private float zloc =
private float xrot =
private float yrot =
private float zrot =
private float xscale =
private float yscale =
private float zscale =
加入相應的屬性代碼
public float XLoc
{
get
{
return xloc;
}
set
{
xloc = value;
}
}
…………
在Render()虛函數中
public virtual void Render()
{
objdevice
objdevice
objdevice
objdevice
objdevice
return;
}
現在回到地球類
public override void Render()
{
base
//把位置變為世界坐標
// meshDevice
//繪制網格
}
現在
四
在這一步加入月球
public class cModel
{
private cMeshObject mesh
private cMeshObject mesh
private bool modelloaded;
}
把窗口代碼中的Load()事件
public void Load(ref Device device)
{
mesh
mesh
if (mesh
{
modelloaded = true;
}
else
{
modelloaded = false;
}
if (mesh
{
mesh
modelloaded = true;
}
else
{
modelloaded = false;
}
}
下面的Update()方法中
public void Update(int dir)
{
if(dir >
{
mesh
mesh
}
else if(dir <
{
mesh
mesh
}
}
在下面的render()方法中
public void Render(ref Device device)
{
device
if(modelloaded)
{
mesh
mesh
}
}
把窗口代碼中的加入燈光的方法
public void LoadLights(ref Device device)
{
device
device
device
device
}
public void Light(ref Device device)
{
device
device
}
五
為了實現與鍵盤
private Microsoft
public System
private float x
private byte[] buttons;
在下面的構造函數代碼中
public CMouse(System
{
mouse = new Microsoft
mouse
mouse
MouseUpdated = new System
mouse
mouse
Update();
}
下面的Update()方法中獲得鼠標的坐標值
public void Update()
{
MouseState state = mouse
x = state
y = state
z = state
buttons = state
}
還需要有一個函數來檢測鼠標左鍵是否按下
public bool LeftButtonDown
{
get
{
bool a;
return a = (buttons[
}
}
六
現在已經做完了准備工作
在圖形初始化函數中創建一個CModel類及CMouse類
private CModel model = null;
private CMouse mouse = null;
private bool leftbuttondown = false;
private float mousexloc;
添加對鼠標初始化的方法
public void InitializeInput()
{
mouse = new CMouse(this);
}
添加UpdateInputState()方法
private void UpdateInputState()
{
mouse
if (mouse
{
if(leftbuttondown == false)
{
mousexloc =
leftbuttondown = true;
}
else
{
mousexloc =
}
}
else
{
leftbuttondown = false;
mousexloc =
}
}
在此程序中
Render()方法更新如下
public void Render()
{
UpdateInputState();
device
SetupCamera();
device
model
model
model
device
device
}
最後更改Main()主函數
static void Main()
{
using (Form
{
EarthForm
EarthForm
EarthForm
while(EarthForm
{
EarthForm
Application
}
EarthForm
}
運行程序
From:http://tw.wingwit.com/Article/program/net/201311/13213.html