Last Update: 2010/10/19
Xna 的一些試作
物件選取/操作、粒子系統、選單等等
2010年10月18日 星期一
Fluid Fire
Painting on Mesh
Last Update: 2010/12/18 12:45+08
上面的影片是用 DirectX 完成的
配合一些基本的向量概念
步驟大致分為
◆ Step1
以滑鼠投影到3D空間的射線與Mesh構成之平面(Plane)
求得滑鼠點擊到的位置(N)
這就不贅述了
◆ Step2
求得 N 在 Mesh 上之 UV 貼圖座標
如下圖所示
PAB為構成Mesh之三頂點
我們在 Step1 中會求得滑鼠射線在平面上的交點
沒有交點自然就沒有 Step2
因此,若 PA 與 PB 不為平行線
就存在著
在三維空間表示成
我們只要求解 變數 a、b
在得知了 a、b ,我們可以求得 UV貼圖座標,例如
還有個問題,請看下圖,是由 0 <= a、b <= 1,所構成之平面
很明顯的,我們的Mesh僅只佔了一半的面積
從上圖也可以看出
解出 c、d
只要滿足 0 <= a、b、c <= 1 就表示在Mesh所構成的三角形裡
d 怎樣的無所謂,看上圖,當 a、b、c 都被限制住的話,d 也跑不掉。
自己(雖然可能不是什麼好物。_。)
Intro
上面的影片是用 DirectX 完成的
配合一些基本的向量概念
步驟大致分為
◆ Step1
以滑鼠投影到3D空間的射線與Mesh構成之平面(Plane)
求得滑鼠點擊到的位置(N)
這就不贅述了
◆ Step2
求得 N 在 Mesh 上之 UV 貼圖座標
如下圖所示
PAB為構成Mesh之三頂點
我們在 Step1 中會求得滑鼠射線在平面上的交點
沒有交點自然就沒有 Step2
因此,若 PA 與 PB 不為平行線
就存在著
在三維空間表示成
我們只要求解 變數 a、b
在得知了 a、b ,我們可以求得 UV貼圖座標,例如
還有個問題,請看下圖,是由 0 <= a、b <= 1,所構成之平面
很明顯的,我們的Mesh僅只佔了一半的面積
從上圖也可以看出
解出 c、d
只要滿足 0 <= a、b、c <= 1 就表示在Mesh所構成的三角形裡
d 怎樣的無所謂,看上圖,當 a、b、c 都被限制住的話,d 也跑不掉。
參考
自己(雖然可能不是什麼好物。_。)
About Me
Last Update: 2010/11/24 10:35+08
SCJP
SCWCD
MCTS
.Net Framework3.5, Asp.net Application
Graphics
彈性形變:以頂點(Vertex)操作達成之形變效果
Painting on Mesh:在Mesh上繪圖
Fluid Fire: 結合 流體力學、熱力學、Volume Render & Cuda
Xna Test:一些試作(物件選取/操作、粒子系統、選單等等...)
認證===
SCJP
SCWCD
MCTS
.Net Framework3.5, Asp.net Application
作品集===
Graphics
彈性形變:以頂點(Vertex)操作達成之形變效果
Painting on Mesh:在Mesh上繪圖
Fluid Fire: 結合 流體力學、熱力學、Volume Render & Cuda
Xna Test:一些試作(物件選取/操作、粒子系統、選單等等...)
2010年10月16日 星期六
彈性形變(計算機圖學)
這是基於彈性及對頂點的操作而進行的變形
為了避免大量的運算,省略了點與點之間的連接作用
而改為令所有點都參考質量中心點而作用
進而達成娛樂或遊戲所需的效果。
參考:
Matthias Müller-Fischer の Meshless Deformations Based on Shape Matching
為了避免大量的運算,省略了點與點之間的連接作用
而改為令所有點都參考質量中心點而作用
進而達成娛樂或遊戲所需的效果。
參考:
Matthias Müller-Fischer の Meshless Deformations Based on Shape Matching
動態掛載 DLL & 調用 Method
Dynamically mount DLL (Assembly) & invoke method
Last Update: 2010/10/17 00:23
這算是最簡單的方式唄
不過有個很嚴重的缺點
它無法卸載DLL(Assembly)(參閱 這裡)
你可以開啟工作管理員來檢視
每次執行都會增加一些記憶體
所以我就使用 AppDomain 來加載DLL
就能用 AppDomain.Unload 來卸載
試作範例下載
現在有 3 個專案
◆ DynMountDll : 主執行
◆ DynMountDll.TestLib : 被掛載之DLL
◆ DynMountDllLib : interface或稱它為協定吧(WCF好像稱為Contract),被上述兩個專案所參照。
OK, 主要是這個函式
它就是負責掛載Assembly、調用Method、再卸載Assembly(AppDomain)
這幾行,應該滿好理解的
我在試作過程遇到的其它問題大致如下
● AppDoman 間的傳遞物件 必須 Serializable 或是 繼承 MarshalByRefObject
● 主要的 AppDomain 並不認識 新的AppDomain 加載的 Assembly
因此,協定(interface)是必要的
AppDomain 和 Assembly 的關係可以參考下圖
順道一提
我這邊的協定只有一個函式 InvokeMethod
它是用來呼叫其它函式的
等於是提供一個進入點(Entry Point)
主要是因為 同組件、不同版本
可能會出現協定中不存在的函式
Last Update: 2010/10/17 00:23
Intro
using System.Reflection;//Assembly, MethodInfo using System.IO;//File ... String dllPath = @"N:\Common.dll"; String typeName = "Common.Class1"; String methodName = "GetVersion"; Assembly assembly = Assembly.Load( File.ReadAllBytes(dllPath)); //載入DLL, ReadAllBytes 是避免 Lock 實體檔案 Object obj = assembly.CreateInstance(typeName); //創建物件實體 MethodInfo method = obj.GetType() .GetMethod(methodName); //取得Method資訊 Console.WriteLine(method.Invoke(obj, new Object[] { }));
這算是最簡單的方式唄
不過有個很嚴重的缺點
它無法卸載DLL(Assembly)(參閱 這裡)
你可以開啟工作管理員來檢視
每次執行都會增加一些記憶體
所以我就使用 AppDomain 來加載DLL
就能用 AppDomain.Unload 來卸載
Implementation
試作範例下載
現在有 3 個專案
◆ DynMountDll : 主執行
◆ DynMountDll.TestLib : 被掛載之DLL
◆ DynMountDllLib : interface或稱它為協定吧(WCF好像稱為Contract),被上述兩個專案所參照。
OK, 主要是這個函式
它就是負責掛載Assembly、調用Method、再卸載Assembly(AppDomain)
這幾行,應該滿好理解的
void MountDllInvokeMethod(String dllPath , String typeName, String methodName) { AppDomain myAppDomain = null; try { FileInfo fi = new FileInfo(dllPath); AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; setup.ApplicationName = "DynMountDll"; myAppDomain = AppDomain.CreateDomain( "AppDomain01", null, setup); DynMountDllLib.IBaseLoader obj = (DynMountDllLib.IBaseLoader) myAppDomain.CreateInstanceFromAndUnwrap( fi.FullName, typeName); MessageShow(obj.InvokeMethod(methodName, new Object[] { })); } finally { if (myAppDomain != null) { AppDomain.Unload(myAppDomain); } } }
我在試作過程遇到的其它問題大致如下
● AppDoman 間的傳遞物件 必須 Serializable 或是 繼承 MarshalByRefObject
● 主要的 AppDomain 並不認識 新的AppDomain 加載的 Assembly
因此,協定(interface)是必要的
AppDomain 和 Assembly 的關係可以參考下圖
順道一提
我這邊的協定只有一個函式 InvokeMethod
它是用來呼叫其它函式的
等於是提供一個進入點(Entry Point)
主要是因為 同組件、不同版本
可能會出現協定中不存在的函式
訂閱:
文章 (Atom)