
WORD可將簡體轉為繁體.但需禁用詞彚轉換.以控制詞彚用法.
- 『校閱』->『繁簡轉換』. 打開『中文繁簡轉換』
| 勾選『簡體中文轉成繁體中文』 |
| 勾選『使用台港澳等地字元』 |
| 取消『轉換常用詞彚』 |
- 選文本 『校閱』->『簡轉繁』

BOOKCARD
電腦




近日Win10經常死機,本想重裝.但發現『希捷磁碟』出現壞道『重定位磁區計數』達100.而且速度太慢.發現TOSHIBA『東芝』XG3-1TB-M.2-MVME-MLC顆粒.勝在壽命長.主控是三星芯片標稱『讀』2400MB/S『寫』1500MB/S.果斷購入.
| 1GiB測試 | 讀Read[MB/s] | 寫Write[MB/s] |
| Seq Q32T1 | 2357.5 | 1448.3 |
| 4KiB Q8T8 | 1097.0 | 481.4 |
| 4KiB Q32T1 | 344.1 | 230.2 |
| 4KiB Q1T1 | 43.01 | 125.3 |
| SSD | 簡介 |
| TOSHIBA CORPORATION | 製造商東芝公司 |
| SOLID STATE DRIVE | 固態驅動器 |
| THNSN51T02DU7 | |
| 8SSSD0F66227T2PL7210028 | |
| CAPACITY 1024GB | 容量1TB. 4塊256GB顆粒組成. |
| FW 410557LA | |
| FPU:00UP610 | |
| 20FEB2017 | |
| 1708KBZ | |
| S/N 27KS1024TFGT | |
| LI P/N:SSD0F66227 | 零件代碼 |
| WARRANTY VOID IF REMOVED | 若撕毀無保養 |
| 3.3V | 電壓 |
| 2.0A | 電流 |
| MADE IN PHILIPPINES菲律賓製造 | 產地 |
| 顆粒 | 簡介 |
| TOSHIBA | 東芝 |
| TH58TFT1JFLBAEG | 元件型號 |
| U79907 | 製造商編號 |
| JAPAN | 產地 |
| 1705KAE | |
| 256GB | 容量 |
| 主控 | 簡介 |
| SAMSUNG 643 | 三星 |
| K4E8304EE-EGCE | |
| YGG583HEC |

近日Google Search Sonsole發現本網有『網頁不適合在移動設備上瀏覽』『此網頁可能難以在移動設備上瀏覽』.本網使用Wordpress不應出現這類情況.細睇之問題在於首頁『index.asp』『未設置視口』與『文字太小,無法閱讀』.此文檔只用作跳轉到wordpress.但Google也作『網址檢查』.本想唔理它,但Google話可能影響網站排名.此問題只以文本編輯『index.asp』在頭部添加viewport屬性.並以ASCII碼保存後上傳.
<meta name=”viewport” content=”width=device-width, initial-scale=1″ />
儅上傳後可讓Google重新進行『網址檢查』按右上角『測試實際網址』若通過則『可建立索引的網址』與『網頁適合透過行動裝置瀏覽』
| 問題 | 修改方法 |
| 未設置視口 | <meta name=”viewport” content=”width=device-width, initial-scale=1″ /> |
| 文字太小,無法閱讀 | |
| 內容寬度超過了屏幕顯示範圍 | 更換Wordpress佈景主題 |
| 可點擊元素之間的距離太近 | |
| 使用了不兼容的插件 | 頁面使用Flash等插件刪除即可 |

重裝Windows10後手多多關左『病毒與威脅防護』即Windows Defender.後在網上Download左只軟體.無耐發現大量文檔後綴被加上[unlockmeplease@cock.li].HRM並且出現DECRYPT_INFORMATION.html一睇話你知文檔以被『愛馬仕HERMES』以RSA2048算法加密.只有支付比特幣作為解密贖金.睇來是中左大名頂頂『勒索病毒』.為免中毒加重『文檔被加密』.果斷關機重裝Win10.經點算大量文檔與被加密.好彩有備份數據實制損失十幾篇blog文章與Android代碼. 此病毒與2017年舉世聞名『魔窟WannaCry』同一原理.其毒害之處再於加密所有檔案,而非破壞運行程式.令你有大量數據損失.經此一劫總結如下:


當想對『磁碟』測速.而手邊又無安裝CrystalDiskMark.可借助Windows10內置測速工具:
D是盤符.但對希捷酷鷹2TB監控盤測量,結果可能有問題.讀取速度達7802.15MB/S
| 命令 | 簡介 |
| winsat disk -drive d | 執行下列所有讀寫測試 |
| winsat disk -drive d -ran -read | 磁盤隨機讀取16 MB時間
Disk Random 16.0 Read |
| winsat disk -drive d -seq -read | 磁盤順序讀取64 MB時間
Disk Sequential 64.0 Read |
| winsat disk -drive d -seq -write | 磁盤順序寫取64 MB時間
Disk Sequential 64.0 Write |
| winsat disk -drive d -flush -seq | 循序寫入的平均讀取時間 |
| winsat disk -drive d -flush -ran | 隨機寫入的平均讀取時間 |


『磁碟』製造商自上世紀未達到萬轉.但一直未有普及.而現役『磁碟』多為5400轉、5900轉、7200轉.可見轉速提高讀寫加快,但工藝與壽命都難以保障.
HD Tune Pro提供『自動噪聲管理』AAM(Automatic Acoustic Management),其原理降低『磁盤』轉速而減小震動和噪聲.從而延長使用壽命.因直接更改『磁碟』固件,所以一次更改永遠有效






近日使用CrystalDiskInfo檢測希捷固態混合磁碟.『磁碟健康狀態』出現黃色警告.而『重定位磁區計數』以達100即已出現壞道.此『磁碟』只用一年多D.睇來只能更換『磁碟』.因為要儘量保障數據安全.聽講HGST『磁碟』故障率最低但價格稍高.而希捷酷鷹為監控而設計.可以長時間大量讀寫數據而不出故障.而且價格比HGST稍低.
網上落單盒裝全新行貨.安裝後分區並格式.使用CrystalDiskMark測『讀寫』速度均接近150MB/S,『機械磁碟』達如此高速,實超我預期.
| 性能 | 簡介 |
| 品牌 | SEAGATE希捷 |
| 系列 | SKYHAWK酷鷹 |
| 型號 | ST200VX008 |
| 接口 | SATA3 SATA 6GBS |
| 轉速 | 5900轉 |
| 容量 | 2TB |
| 級別 | 64路7*24全天監控級 |
| 讀取READ | 149.4MB/S |
| 寫入WRITE | 148.6MB/S |


S.M.A.R.T即『自監測分析與報告技術』據我記憶所及應在上世紀未出現.當時並不清其用途.近日使用CrystalDiskInfo檢測磁碟健康狀態.其工作原理就是讀取磁碟S.M.A.R.T.資訊.磁碟工作其間會自動監測電機、電路、磁盤、磁頭狀態進行分析與記錄.此技術支持『HDD,SSD, SSHD,USB,RAID,NVME』磁碟.在檢測『希捷固態混合磁碟』出現黃色警號.『重定位磁區計數』以達100遠超臨界值36.亦即壞道出現.雖然使用HD Tune Pro進行『錯誤掃描』未見壞區,這只是由於壞道被映射到後備扇區.屬于『磁碟』自我修復.當『磁碟』發現壞區時,便將其物理空間指向到特定無損區域進行重映射修復,從而使硬盤出現壞區仍可使用.但當過多壞道出現.後備扇區消耗殆盡而無法再重映射時,就會出現壞區並不可修復.若繼續使用必造成數據損失.此『磁碟』只使用一年多D睇來質量確實有問題.
| 警訊 | 簡介 |
| 綠色 | 安全使用 |
| 黃色 | 危險警告,更換磁碟轉移數據 |
| 紅色 | 死亡邊緣,備份數據暫停使用 |
| ID | 屬性名稱 | 簡介 |
| 01 | 底層資料讀取錯誤率 | 磁頭讀取數據時錯誤率.只有SSD此值為0 |
| 03 | 碟片啟動時間 | |
| 04 | 馬達啟動關閉次數 | |
| 05 | 重定位磁區計數 | 出現壞區.若數值不斷整長說面壞道擴散 |
| 07 | 尋道錯誤率 | |
| 09 | 總通電時間 | 用於確定是否返修盤 |
| 0A | 啟動重試次數 | 電機重啟量.有可能是USB電壓不足 |
| 0C | 開關電源次數 | |
| B8 | 終端校驗出錯 | |
| BB | 報告不可糾正錯誤 | |
| BC | 通訊超時 | 磁碟無法連接.若非零則可能是電源或獲數據線問題 |
| BD | 磁頭寫入高度 | |
| BE | 氣流溫度 | |
| BF | 加速度錯誤率 | |
| C0 | 電源關閉磁頭收回計數 | |
| C1 | 載入/卸載迴圈計數 | |
| C2 | 硬碟溫度 | |
| C5 | 等候重定的磁區計數 | 假性壞區可修復 |
| C6 | 無法校正的磁區計數 | 不修復壞區量 |
| C7 | UltraDMA高速傳輸模式錯誤次數 |

CrystalDiskMark用於測量各種存儲『HDD、SSD、USB』磁碟速度基準軟件.它由日本開發商Hiyohiyo開發而且是免費軟件.我手頭上只有幾款磁碟.讀寫速度差距非常之大.基本上都以SSD>HDD>USB這樣排列.從下表可睇到『固態混合型』HDD+SSD讀取快寫入慢.而最慢則是USB移動磁碟.
| 磁碟 | 類型 | 讀MB/S | 寫MB/S |
| THNSNH128GBST : 128.0 GB | SSD | 548.1 | 502.7 |
| ST2000VX008-2E3164 : 2000.3 GB | HDD | 149.4 | 148.6 |
| ST500LX025-1U717D : 500.1GB | SSHD | 171.3 | 57.67 |
| ST1000LM024 HN-M101MBB : 1000.2 GB | HDD+USB3.0 | 39.10 | 36.28 |
| 測試 | 簡介 |
| ALL | 執行所有測試 |
| Seq Q32T1 | 順序讀寫測試32隊列,1線程測試 |
| 4KiB Q8T8 | 4KiB分頁隨機讀寫測試8『佇列』,1『執行緒』 |
| 4KiB Q32T1 | 4KiB分頁隨機讀寫測試32『佇列』,1『執行緒』 |
| 4KiB Q1T1 | 4KiB分頁隨機讀寫測試1『佇列』,1『執行緒』 |


若你購買全新磁碟非返修盤,必定是未建立分區.當你連結電源與SATA還需要建立分區.在Windows10有兩種方法分別是『儲存空間』與『磁碟管理』
使用『儲存空間』建立分區並格式化
使用『磁碟管理』建立分區並格式化

之前講解在Android遊戲種使用『點陣字體』使用Photoshop繪畫.但要對齊所有字符效果並不理想.但『Codehead’s Bitmap Font Generator』可以幫助你生成『點陣字體』.而且把非等距字體自動對齊.通過記錄每個自體寬度生成非等距文本.可以從www.codehead.co.uk/cbfg/免費獲取.以創建羅馬體為例:

最早8bit遊戲機非常適合使用芯片音(chip tunes).芯片音是一種音效通過合成器生成.而as3sfxr則是專業音效工具.可以通過www.bfxr.net下載WINDOWS或MAC版本.跳躍音效生成簡介.
| 音效 | 簡介 |
| Pickup/Coin | 拾取/硬幣 |
| Laser/Shoot | 激光/射擊 |
| Explosion | 爆炸 |
| Powerup | 加電 |
| Hit/Hurt | 命中/傷害 |
| Jump | 跳躍 |
| Blip/Select | 彈開/選擇 |
| Randomize | 隨機 |
| Mutation | 異變 |
| 合成器 | 簡介 |
| Triangle | 三角形濾波 |
| Sin | 正弦濾波 |
| Square | 平方濾波 |
| Saw | 聲表面波濾波器 |
| Breaker | 斷路 |
| Tan | 正切濾波 |
| Whistle | |
| White | |
| Pink | 粉紅噪聲 |
| 按扭 | 簡介 |
| Export Wave | 儲存單個wav『音效』 |
| Export All Waves | 儲存所有wav『音效』 |
| Clear All | 清除所有wav『音效』 |
| Duplicate Synth | 複製合成『音效』 |
| Copy Link | 複製『音效』鏈接 |
是時候將之前所學OpenGL/DirectX知識粘合成一完整遊戲.最簡單是『第一人稱視角射擊遊戲』FPS(First-person Shooter). 通過控制『準星』描准『怪物』按滑鼠左鍵發射『飛彈』.若擊中便會『爆炸』並擊殺『怪物』,其實它會在另地在生.若擊中地面則會『爆炸』.按鍵盤上下鍵在山地中前後移動.若近距離接近『怪物』它會另轉面自動走開(AI部分). 所有『怪物』與『飛彈』都是MD2模型.按ESC鍵退出遊戲.下載FPS:
下面所需要文章與代碼:

AI也就是『人工智能』在遊戲中實現多數使用『狀態機』.通過定義大量狀態.然後通過條件判斷而切換當前狀態.從而實現對外界作出反應. 當『怪物』它會觀察四周.當你接近它時會另轉面走開.
首先定義下面幾個狀態
#define AI_IDLE 0 // 站立
#define AI_RUN 1 // 奔跑
#define AI_DEATH 3// 死亡
初此AI狀態變量設為站立
int ai = AI_IDLE;
『狀態機』判斷結構
if (ai == AI_IDLE) // 站立
{
}
else
if (ai == AI_RUN)// 奔跑
{
}
else
if (ai == AI_DEATH)// 死亡
{
}
站立轉身走開AI代碼
1.首先計算兩者距離
VECTOR3D distance = pos – player.pos;
length = Length_VECTOR3D(&distance);
2.計算『怪物』與『玩加』 矢量之間夾角
Normalize_VECTOR3D(&distance);// 長度歸一
VECTOR3D v;
Init_VECTOR3D(&v, 0, 0, -1);
angle = RAD_TO_DEG(Angle_VECTOR3D(&distance, &v0));// 角度
2.若距離小於10米則會轉身離開
if (length < 10 ){
ai = AI_RUN;// 奔跑
rot.y = (angle – 90) + ((rand() % 90) – 45);// 轉身走開.有45度隨機角度
}

『物體』運動核心是碰撞.你試想下當『物體』高速運動時有可能會穿越牆壁.這因遊戲世界中CPU會輪詢處理所有『物體』. 並只會分到有限『運算/時間』,所以每一次你都需要準確計算碰撞時間.通過不斷遞歸而確定最後移動位置
通過使用基於時間二維方程式進行碰撞檢測.
xf=x0+v0t+(1/2)at2
ax2+bx+c=0
利用係數替換可得到
a=(1/2)*a
b=v0
c=x0-xf
將其擴展可得到三維方程式
xt=cx+bxt+axt2
yt=cy+byt+ayt2
zt=cz+bzt+azt2
如果將三維方程應用於平面方程可得
Axt+Byt+C*zt+D=0
此方程說面如果物體與平面發生碰撞.其碰撞點位於(xt,yt,zt)通過代數運算可得到
(Aax+Bay+Caz)x2+(Abx+Bby+Cbz)x+(Acx+Bcy+Ccz)+D=0
這其實就是平面二次方程式(ax2+bx+c=0) ,其點積形式為:
ax2=(Aax+Bay+Caz)x2=N•(1/2)A
利用點積得到二次方程係數:
加速度係數: a=N•(0.5A)
速度係數: b=N•V
距離係數: c=N•X+D
有上序二次方程係數就可計算碰撞時間
float a = n % (acceleration * 0.5f);// 加速度係數
float b = n % velocity;// 速度係數
float c = n % position + D – radius;// 距離係數
若a=0加速度係數為零,碰撞時間等於距離係數除以速度係數.因為距離係數小於零所以要去負值.
collisionTime = -c/b;
若a!=≠0加速度係數不為零,可以使用二次方程計算碰撞時間:
x=(-b+√(b2-4ac) ) / 2a
在計算碰撞時間之前可先計算D=b2-4ac 若D小於零則無解.若D大於零則有解
float D = b * b – 4 * a*c;
if (D > 0) // 如果判斷式大於等於零
collisionTime = (-b – sqrtf(D)) / (2 * a); // 計算碰撞時間
因為發生碰撞物體會彈開,方向矢量產生返射需要重新計算位置.通過減去碰撞時間進行遞歸.直到『幀時間』為零
下面是『曲棍球』碰撞函式.
puck 是曲棍球.
table 是球臺
deltaTime是幀時間
void Update_Puck(PUCK_PTR puck, TABLE_PTR table, float deltaTime){
float fastestTime = deltaTime;// 最早碰撞時間
float collisionTime;// 碰撞時間
PLANE3D_PTR plane = NULL;// 平面
PLANE3D_PTR planeCollision = NULL;// 碰撞平面
if (deltaTime <= 0.000f)// 遞歸
return;
// 對球臺四個圍邊檢查碰撞
for (int i = 0; i < 4; i++){
plane = &table->wall[i];// 平面
// 點積二次方程
float a = plane->n % (puck->acceleration * 0.5f);// 加速度係數
float b = plane->n % puck->velocity;// 速度係數
float c = plane->n % puck->position + plane->D – puck->radius;// 距離係數
if (a == 0 && b != 0 && c != 0){// 如果無加速度
// 碰撞時間等於距離除以速度
collisionTime = -c/b;// 碰撞時間
if (collisionTime >= 0 && collisionTime < fastestTime){// 發生碰撞
fastestTime = collisionTime;// 保存碰撞時間
planeCollision = plane;// 平面
}
}
else
if(a != 0){
// 加速度a不等於零
// 計算判別式
float D = b * b – 4 * a*c;
if (D > 0) {// 如果判斷式大於等於零
// 計算碰撞時間
collisionTime = (-b – sqrtf(D)) / (2 * a);
if (collisionTime >= 0.0f && collisionTime < fastestTime) {// 發生碰撞
fastestTime = collisionTime;
planeCollision = plane;
}
}
}
}// END FOR
// 速度設上限每秒800米
if (Length_VECTOR3D(&puck->velocity) > 800)
puck->velocity = Normalize_VECTOR3D(&puck->velocity) * 800;
// 如果冰球正移動,則應用磨擦力
if (Length_VECTOR3D(&puck->velocity) > 0)
puck->acceleration = -puck->velocity * 0.2f;// 計算加速度
// 計算當前位置
puck->position = puck->position + puck->velocity * fastestTime + puck->acceleration * (fastestTimefastestTime0.5f);
// 應用磨擦力
puck->velocity = puck->velocity + puck->acceleration * fastestTime;
// 如果發生碰撞,反轉速度
if (planeCollision != NULL)// 碰撞平面
puck->velocity = Reflection_VECTOR3D(&puck->velocity, &planeCollision->n);
// 遞歸調用
Update_Puck(puck, table, deltaTime – fastestTime);
}

若3D模型發生碰撞後需要計算碰撞反應,不通物體運動有不同碰撞反應.但物體多數以直線運動.物體彈回角度和碰撞角度相等.
入射角度:桌球運動方向與邊沿平面法線向量之間夾角.
反射角度:垂直於運動方向矢量
例:當桌球撞向邊沿.它將按撞擊角度與之對等『入射角度』彈開
方程並沒有考慮球體旋轉作用力與磨擦力.最終得到計算反射方向方程式
給定運動方向矢量I與垂直法線N求碰撞反射方向F
F = (I – N2 (I % N)) * | I |;
計算反射方向代碼,dir為射線方向,normal為碰撞面法線
VECTOR3D Reflection_VECTOR3D(VECTOR3D_PTR dir,VECTOR3D_PTR normal){
VECTOR3D vec ;
Normalize_VECTOR3D(dir, &vec); // 單為化方向向量
*dir = (vec – *normal * 2.0f * (vec % *normal)) * Length_VECTOR3D(dir);
return *dir;
}

平面是3D圖形學重要部分.平面有兩個重要概念.
1.3D平面都無窮遠延伸
2.所有平面都將整個空間分成兩個半空間.正半空間為法線指向空間,負半空間則是令一則空間.這個特性對於碰撞算法重要
平面描敘如下:
平面法線向量:n=(a,b,c)
平面任意點:p0=(x0,y0,z0)
平面任意點:p=(x,y,z)
平面與原點距離:d平面位移常量(plane-shift constant)
因為法線n與向量(p0->p)垂直. 因兩垂直向量點積為零:
n * (p0->p) = 0
轉為分量表示
(a,b,c)*(x-x0,y-y0,z-z0)=0
轉為『頂點』與『法線』表示
a(x-x0)+b(y-y0)+c*(z-z0)=0
ax+by+cz+(-ax0-by0-cz0)=0
令d=-ax0-by0-c*z0
『平面方程』如下:
ax+by+c*z+d=0
這足以定義平面結構
typedef struct PLANE3D_TYP{
VECTOR3D n;//平面法線向量(不必是單位向量)
float dist;//平面到原點最近距離
POINT3D p0;//平面上最近原點的點
}PLANE3D,*PLANE3D_PTR;
判斷『點』位於『平面』那個半空
3D世界中『視點』、『角色』並不能穿越牆壁.要做到這步需判斷點位於平正空間(法線指向)還是負空間.
要判斷這點需要下面的平面方程
hs=a(x-x0)+b(y-y0)+c*(z-z0)
只需將點(x,y,z)帶入方程中並計算結果
如果hs=0則該點位於平面之上
如果hs>0則該點位於平面正半空間(法線指向)中
如果hs<0則該點位於平面負半空間中
float Compute_Point_In_Plane3D(PLANE3D_PTR plane,VECTOR3D_PTR pt){
float hs = plane->A * pt->x + plane->B * pt->y + plane->C * pt->z + plane->D;
return(hs); // 返回半空間值
}
計算平面與直線之相交點(3D空間)
平面『頂點』與『法線』方程如下:
a(x-x0)+b(y-y0)+c*(z-z0)=0
3D直線方程如下:
(x-x0)/a = (y-y0)/b = (z-z0)/c
計算多邊形法線與直線方向點積
double a = plane->n % (line->v);
若為零則直線與平面平行
VECTOR3D Intersect;
if (a == 0)
Intersect = line->p0;
計算相交點
Intersect = line->p0 – (line->v) * ((plane->n % line->p0 + plane->D) / a);
3D線段與3D平面交點函式:
bool Intersect_Line3D_Plane3D(PLANE3D_PTR plane, PARMLINE3D_PTR line,POINT3D_PTR pt){
// 計算直線方向與多邊形法線點積
double a = plane->n % (line->v);
if (a == 0)
return false;
// 計算相交點
*pt = line->p0 – (line->v) * ((plane->n % line->p0 + plane->D) / a);
return true;
}
計算頂點是否為於多邊形之上,
首先計算頂點與多邊形所有頂點之間角度總和.如果該頂點位於多邊形之上.那麼此頂點與多邊形所有頂點之間角度總和將等於或接近2PI
bool Intersect_Vector3D_Polygon3D(VECTOR3D_PTR polygon, int num,VECTOR3D_PTR v){
VECTOR3D segment1, segment2;// 頂點 到 多邊形頂點 矢量
double length1, length2;// 矢量長度
double sumAngle = 0;// 矢量之間角度總和
double cosAngle = 0;// 兩矢量余弦角
// 編曆多邊形所有頂點
for (int index = 0; index < num; ++index) {
segment1 = polygon[index] – *v;
segment2 = polygon[(index+1) % num] – *v; // % num 確保數值環形加一
length1 = Length_VECTOR3D(&segment1);
length2 = Length_VECTOR3D(&segment2);// 矢量長度
//檢查頂點是否落在多邊形邊界上
if ( length1 * length2 <= 0.0000001f){
// 多邊形邊界被認為是多邊形內部
sumAngle = PI2; // pai * 2
break;
}
// 計算上述兩個矢量之間余弦角
cosAngle = (segment1 % segment2) / (length1 * length2);
// 將計算結果累加入角度總和
sumAngle = sumAngle + acosf(cosAngle);
}
if ((sumAngle <= PI2 + 0.0000001f) && (sumAngle >= PI2 – 0.0000001f))
return true;// 頂點與多邊形發生碰撞
else
return false;
return true;
}
使用三個頂點初始化(定義)3D平面!
void Init_PLANE3D(PLANE3D_PTR plane,VECTOR3D_PTR va,VECTOR3D_PTR vb,VECTOR3D_PTR vc){
VECTOR3D normalA = *vc – *va;// 計算頂點C->A向量
VECTOR3D normalB = *vc – *vb;// 計算頂點C->B向量
plane->n = Cross_VECTOR3D(&normalA, &normalB);// 計算兩個3D向量叉積
plane->D = Dot_VECTOR3D(&(-(*va)), &plane->n); //距離等於va求返後與n求點積
}

矢量(VECTOR)也稱『向量』其實是抽象『量』它在遊戲世界被頂義為『位置』『速度』『磨擦』『方向』『點』等等. 矢量通常有3種
| 矢量 | 分量 | 簡序 |
| 2D矢量 | x,y | 2D空間 |
| 3D矢量 | x,y,z | 3D空間 |
| 4D矢量 | x,y,z,w | 3D空間w總是為1.用於方陣運算 |
首先定義3D矢量結構:
typedef struct VECTOR3D_TYP{
float x,y,z;
}VECTOR3D,*VECTOR3D_PTR;
下面是3D矢量(VECTOR)運算函式庫.
計算3D矢量長度,矢量長度也稱為範數(norm).將其理解為原點(0,0,0)到矢量(x,y,z)之距離
float Length_VECTOR3D(VECTOR3D_PTR va){
return( (float)sqrtf(va->xva->x + va->yva->y + va->z*va->z) );
}
對3D矢量進行歸一化(normalize),也就使其長度縮放為1,但同時方向保持不變.它通常被用於無需理會長度之運算如『方向』
void Normalize_VECTOR3D(VECTOR3D_PTR va){
// 1.首先計算長度
float length = sqrtf(va->xva->x + va->yva->y + va->z*va->z);
//2.矢量除以長度得到歸一化矢量
va->x= va->x/length;
va->y= va->y/length;
va->z= va->z/length;
}
3D矢量點積運算可以理解為矢量乘法.先將各分量相乘後再相加得到一個標量
float operator%(VECTOR3D va, VECTOR3D vb){
return((va.x * vb.x) + (va.y * vb.y) + (va.z * vb.z));
}
float Dot_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){
return( (va->x * vb->x) + (va->y * vb->y) + (va->z * vb->z) );
}
叉積是另一種矢量乘法,叉積運算最小要有3個分量才有效.
VECTOR3D operator^(VECTOR3D va, VECTOR3D vb){
VECTOR3D vn;
vn.x = ((va.y * vb.z) – (va.z * vb.y));
vn.y = -((va.x * vb.z) – (va.z * vb.x));
vn.z = ((va.x * vb.y) – (va.y * vb.x));
return(vn);
}
VECTOR3D Cross_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){
VECTOR3D vn;
vn.x = ( (va->y * vb->z) – (va->z * vb->y) );
vn.y = -( (va->x * vb->z) – (va->z * vb->x) );
vn.z = ( (va->x * vb->y) – (va->y * vb->x) );
return(vn);
}
計算兩個3D矢量va和vb之間夾角余弦值
float CosTh_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){
return(Dot_VECTOR3D(va,vb)/(Length_VECTOR3D(va)*Length_VECTOR3D(vb)));
}
計算三角形法線
void Normal_VECTOR3D(VECTOR3D_PTR normal,VECTOR3D_PTR va, VECTOR3D_PTR vb, VECTOR3D_PTR vc){
VECTOR3D u, v, n;
float length;
u = *vb – *va;
v = *vc – *va;
n = u^v;//Cross_VECTOR3D(&u, &v, &n);// 計算叉積
length = sqrtf(n.xn.x + n.yn.y + n.z*n.z);
normal->x = n.x/length;
normal->y = n.y/length;
normal->z = n.z/length;
}
將兩個3D矢量相加(va + vb),如用於位置移動
VECTOR3D operator+(VECTOR3D va, VECTOR3D vb){
VECTOR3D vsum;
vsum.x = va.x + vb.x;
vsum.y = va.y + vb.y;
vsum.z = va.z + vb.z;
return (vsum);//返回相加結果!
}
將兩個3D矢量相減(va – vb),如用於位置移動
VECTOR3D operator-(VECTOR3D va, VECTOR3D vb){
VECTOR3D vdiff;
vdiff.x = va.x – vb.x;
vdiff.y = va.y – vb.y;
vdiff.z = va.z – vb.z;
return(vdiff); //返回相減向量!
}
3D矢量反數,如返轉方向
VECTOR3D operator-(VECTOR3D v){
VECTOR3D negation;
negation.x = -v.x ;
negation.y = -v.y ;
negation.z = -v.z ;
return(negation); //返回反數向量!
}
使用縮放因子k對3D矢量進行縮放如:位置=位置+速度*時間
VECTOR3D operator*(VECTOR3D va, float k){
VECTOR3D vscaled;
vscaled.x = k * va.x;
vscaled.y = k * va.y;
vscaled.z = k * va.z;
return vscaled;// 返回縮放後向量
}
3D矢量賦值
void Init_VECTOR3D(VECTOR3D_PTR v, float x,float y,float z) {
v->x = x; v->y = y; v->z = z;
}
3D矢量拷貝
Copy_VECTOR3D(VECTOR3D_PTR vdst, VECTOR3D_PTR vsrc){
vdst->x = vsrc->x; vdst->y = vsrc->y; vdst->z = vsrc->z;
}
3D矢量比較
bool operator==(VECTOR3D vdst, VECTOR3D vsrc){
if (vdst.x == vsrc.x && vdst.y == vsrc.y && vdst.z == vsrc.z)
return true;
else
return false;
}
3D向量不等比較
bool operator!=(VECTOR3D vdst, VECTOR3D vsrc)
{
if (vdst.x != vsrc.x || vdst.y != vsrc.y ||vdst.z != vsrc.z)
return true;
else
return false;
}
向量歸零(3D向量)無方向,無距離,代表位於原點
void Zero_VECTOR3D(VECTOR3D_PTR v) {
v->x = v->y = v->z = 0.0f;
}
計算兩矢量之間夾角
float Angle_VECTOR3D(VECTOR3D_PTR va, VECTOR3D_PTR vb){
return acosf(*va % *vb);
}
角度轉弧度
#define DEG_TO_RAD(ang) ((ang)*PI/180.0)
弧度轉角度
#define RAD_TO_DEG(rads) ((rads)*180.0/PI)
隨機數 x:下限, y:上限.
#define RAND_RANGE(x,y) ( (x) + (rand()%((y)-(x)+1)))
隨機數: -1.0 ~ 1.0
#define FRAND_RANGE1() (((float)rand()-(float)rand())/RAND_MAX)
隨機數 0~1
#define FRAND_RANGE() ((float)rand() / (float)RAND_MAX)

『邊界球』雖然可解卻大部3D模型『碰撞測試』問題.單若3D模型是長條形則不適合如『牆體』『長劍』.『軸對齊坐標邊界盒』axis-aligned bounding box(AABB)引入則可解決這類問題.每個『邊界盒』均由3D模型『中心點』與『最遠點』、『最近點』所組成.通過遍歷每個3D模型頂點找出XYZ三軸上最遠頂點.定義3D邊界盒:
typedef struct AABB_TYP {
VECTOR3D center;// 中心點
VECTOR3D far;// 最遠
VECTOR3D near;// 最近
}AABB, *AABB_PTR;
『3D模型』最遠點與最近點可遍歷所有3D模型頂點獲得:
1.最遠點與最近點清零
VECTOR3D far = {0,0,0};// 最遠點
VECTOR3D near = {0,0,0};// 最近點
2.遍歷所有3D頂點
for (int index = 0; index < vertex_num; ++index){
3.XYZ三軸最遠點
if (far.x > vertex_array[index].x)
vertex_array[index].x = far.x;
if (far.y > vertex_array[index].y)
vertex_array[index].y = far.y;
if (far.z > vertex_array[index].z)
vertex_array[index].z = far.z;
4.XYZ三軸最近點
if (near.x > vertex_array[index].x)
vertex_array[index].x = near.x;
if (near.y > vertex_array[index].y)
vertex_array[index].y = near.y;
if (near.z > vertex_array[index].z)
vertex_array[index].z = near.z;
}
判斷頂點是否為於邊界盒
bool Compute_Point_In_AABB(AABB_PTR aabb, VECTOR3D_PTR point)
{
if ((point->x >= aabb->center.x + aabb->near.x && point->x <= aabb->center.x + aabb->far.x) &&
(point->y >= aabb->center.y + aabb->near.y && point->y <= aabb->center.y + aabb->far.y) &&
(point->z >= aabb->center.z + aabb->near.z && point->z <= aabb->center.z + aabb->far.z) )
return true;
return false;
}

DirectX本是用於取替OpenGL給遊戲廠商使用.但遊戲廠商集體反抗.才另microsoft支持OpenGL.而且自DirectX6全面使用COM模型開發.DirectX是設計用於『影片』『聲音』『輸入』『網絡』抽象軟件界面結口.DirectX接口由microsoft定義.而底層則有驅動程式與硬件進行通信.開發者完全無需理會硬件之間差異.如果硬件不支持則由DirectX進行模擬.
#include “..\DirectX\Include\ddraw.h”
#include “..\DirectX\Include\dinput.h”
#include “..\DirectX\Include\dsound.h”
#ifdef _WIN64
#pragma comment(lib, “DirectX\Lib\x64\ddraw.LIB”)
#pragma comment(lib, “DirectX\Lib\x64\dinput8.LIB”)
#pragma comment(lib, “DirectX\Lib\x64\dxguid.LIB”)
#pragma comment(lib, “DirectX\Lib\x64\dsound.LIB”)
#else
#pragma comment(lib, “DirectX\Lib\x86\ddraw.LIB”)
#pragma comment(lib, “DirectX\Lib\x86\dinput8.LIB”)
#pragma comment(lib, “DirectX\Lib\x86\dxguid.LIB”)
#pragma comment(lib, “DirectX\Lib\x86\dsound.LIB”)
#endif
上面方法是指定工程目錄.令外你還可制定Visual Studio搜索目錄:
在DirectX8之前分別使用DirectSound和DirectMusic處理音頻播放. DirectSound用于處理聲波回放和捕足,而DirectMusic則是加載和播放所有聲音主要組件.但在DirectX8之後合平DirectXAudio組件.若你需要播放MIDI睇『DirectMusic之播放MIDI』



.MD2文檔由美國id Software為其QuakeII開發3D模型.雖然它無骨架但它讀取簡單,而最重要是可以通過Internet穩到大量MD2文檔.根據模型規範.MD2格式最多含198動畫幀編號為0~197. 動畫幀將用於組成『步行』『功擊』『站立』『死亡』等動畫.MD2文檔 通常有下面幾個文檔組成:
| 文檔 | 簡述 |
| TRIS.MD2 | 角色3D模型 |
| WEAPON.MD2 | 武器3D模型 |
| TRIS.PCX | 角色皮膚也就是紋理圖檔,通常為8Bit『256色』長寬為256*256保存為.PCX格式 |
| WEAPON.PCX | 武器皮膚 |
| MD2格式 | 簡述 |
| Head | 文檔頭部格式3D模型描述 |
| Data | 3D數據 |
| MD2文檔頭部格式 MD2_HEADER | 簡述 |
| int id; | MD2文檔標記’IDP2′,用於判斷是否MD2文檔 |
| int version; | 版本號總為8 |
| int skin_width | 皮膚紋理圖寬度.此值相對於紋理座標textcoord,通常為256 |
| int skin_height; | 皮膚紋理圖高度.此值相對於紋理座標textcoord,通常為256 |
| int frame_size; | 每幀字節總量 |
| int skin_num; | 皮膚紋理總量,忽略. |
| int vertex_num; | 單幀頂點量.每幀字節量均相同.有些教科書搞錯左此值. |
| int textcoord_num; | 紋理座標總量 |
| int polygon_num; | 多邊形總量 |
| int command_num; | OpenGL命令總量,忽略 |
| int frame_num; | 幀總量id softwarek規定為198幀編號為0~197.有些模型可能多於此值 |
| int skin_offset; | 皮膚pcx偏移量每個64字節.因包含QuakeII專用路徑.忽略. |
| int textcoord_offset; | 紋理座標偏移量 |
| int polygon_offset; | 多邊形偏移量 |
| int frame_offset; | 幀偏移量 |
| int command_offset; | 命令偏移量忽略 |
| int end_offset; | 結尾偏移量.相當於文檔長度 |
MD2紋理座標通過(data + textcoord_offset)得到,結構如下:
typedef struct MD2_TEXTCOORD_TYP {
WORD u, v;
}MD2_TEXTCOORD,*MD2_TEXTCOORD_PTR;
MD2多邊形通過(data + polygon_offset)得到,保存頂點與紋理索引.結構如下:
typedef struct MD2_POLYGON_TYP {
WORD vertex_index[3];// 頂點索引
WORD textcoord_index[3];// 紋理座標索引
}MD2_POLYGON,*MD2_POLYGON_PTR;
MD2關鍵幀通過(data + frame_offset)得到,幀頭包含對頂點進行縮放與平移因子.頂點數組長度由vertex_num確定.結構如下:
typedef struct MD2_FRAME_TYP{
float scale[3];// 縮放
float translate[3];// 平移
char name[16];// 動畫幀ASCII名
MD2_POINT list[1];// 頂點數組
}MD2_FRAME,*MD2_FRAME_PTR;
MD2頂點包含於關鍵幀裡,每個頂點由『xyz座標』與『法線索引』組成.『法線索引表』你需要自已構建.法線將在運行時計算所以忽略.結構如下:
typedef struct MD2_POINT_TYP {
BYTE v[3];// xyz頂點
BYTE noraml_index;// 頂點法線索引,此值忽略
}MD2_POINT,*MD2_POINT_PTR;
MD2動畫,用於控制模型動作速度,以秒為單位.結構如下:
typedef struct MD2_ANIMATION_TYP{
int start; // 起始幀索引
int end; // 結束幀索引
float irate; // 插幀頻率(0.0f~1.0f),1.0f表示不插幀
float speed; // 用於控制動畫播放時間,一般設為0~10秒
} MD2_ANIMATION, *MD2_ANIMATION_PTR;
| 動畫索引 | 動作名 | 幀索引 | 插幀頻率(幀) | 播放時間(秒) |
| 0 | STANDING_IDLE站立 | 0-39 | 0.5f | 4 |
| 1 | RUN奔跑 | 40-45 | 0.5f | 4 |
| 2 | ATTACK開火/攻擊 | 46-53 | 0.5f | 2 |
| 3 | PAIN1 | 54-57 | 0.5f | 4 |
| 4 | PAIN2 | 58-61 | 0.5f | 4 |
| 5 | PAIN3 | 62-65 | 0.5f | 4 |
| 6 | JUMP跳躍 | 66-71 | 0.5f | 5 |
| 7 | FLIP手勢 | 72-83 | 0.5f | 3 |
| 8 | SALUTE 敬禮 | 84-94 | 0.5f | 5 |
| 9 | TAUNT 嘲笑 | 95-111 | 0.5f | 5 |
| 10 | WAVE 揮手致意 | 112-122 | 0.5f | 5 |
| 11 | POINT 指向它人 | 123-134 | 0.5f | 5 |
| 12 | CROUCH STAND 蹲伏-不動 | 135-153 | 0.5f | 5 |
| 13 | CROUCH WALK 蹲伏-行走 | 154-159 | 0.5f | 5 |
| 14 | CROUCH ATTACK 蹲伏-開火 | 160-168 | 0.5f | 5 |
| 15 | CROUCH_PAIN 蹲伏-被擊打 | 169-172 | 0.5f | 5 |
| 16 | CROUCH_DEATH 蹲伏-死亡 | 173-177 | 0.25f | 5 |
| 17 | DEATH_BACK 死亡-後趴 | 178-183 | 0.25f | 5 |
| 18 | DEATH_FORWARD 死亡-前趴 | 184-189 | 0.25f | 5 |
| 19 | DEATH_SLOW 緩慢死亡 | 190-197 | 0.25f | 5 |
現在需要MD2結構用於保存3D模型數據
| MD2模型數據結構 | 簡述 |
| MD2_ANIMATION animation_array[20] | 動畫,MD2通常有20種不同動作 |
| int animation_num; | 動畫總量 |
| int frame_num; | 幀量id softwarek規定198幀 |
| MD2_POLYGON_PTR polygon_array; | 多邊形列表 |
| int polygon_num; | 多邊形總量 |
| VECTOR3D_PTR vertex_array; | 頂點數組 長度=幀總量*單幀頂點量 |
| int vertex_num; | 單幀頂點量 |
| VECTOR2D_PTR textcoord_array; | 紋理座標數組,只有一組,由所有幀共享 |
| int textcoord_num; | 紋理座標總量 |
| TEXTURE texture_array[8] | 紋理skin |
| int texture_num; | 皮膚紋理圖總量 |
| float radius_avg; | 平均半徑 |
| float radius_max; | 最大半徑 |
在遊戲中低級單位都一至如步兵.需要單獨保存位置、面方、動畫等狀態.需要一個新結構對MD2進行封裝.以共享數據節約空間.並且為讓動畫流暢需要對關鍵幀進行插值(插入其它幀).
| 3D模型結構定義(MODEL3D) | 簡述 |
| int state; | 狀態, 死亡/存活 |
| int attr; | 屬性 |
| int color; | 沒有紋理時使用顏色 RGB(255,255,255) |
| VECTOR3D pos; | 位置 |
| VECTOR3D rot; | 旋轉 |
| int anim; | 動畫索引 |
| bool loop; | 循環播放 |
| float speed; | 動畫速度,(0.0f~1.0f)數值越小速度越慢,數值越大速度越快 |
| float frame; | 當前幀索引 |
| float irate; | 插幀頻率(0.0f~1.0f),1.0f表示不插幀 |
| float count; | 插幀計數器 |
| bool complete; | 動畫完成播放標記 |
| VECTOR3D_PTR vertex_array; | 單幀頂點量 |
| VECTOR3D_PTR normal_array; | 法線數組 |
| TEXTURE_PTR texture; | 指向紋理 |
| MD2_PTR md2; | 指向MD2模型 |
在載入數據之前還需要定義幾個頂點控制
#define MD2_INVERT_X 0x0001// 反轉X軸
#define MD2_INVERT_Y 0x0002// 反轉Y軸
#define MD2_INVERT_Z 0x0004// 反轉Z軸
#define MD2_SWAP_XY 0x0010// 交換XY軸
#define MD2_SWAP_YZ 0x0020// 交換YZ軸
#define MD2_SWAP_XZ 0x0040// 交換XZ軸
#define MD2_INVERT_WINDING_ORDER 0x0100 // 反轉環繞順序
基本結構已定義可以讀取數據並分釋:
bool Load_Data_MD2(MD2_PTR md2, PBYTE data, int size,float scale,DWORD flag ){
1.讀取MD2頭部,data為文檔數據
MD2_HEADER_PTR header = (MD2_HEADER_PTR)data;
2.判斷是否MD2模型
if (header->id != ‘2PDI’) // MD2文檔標記
return false;
3.判斷版本號總為8
if (header->version != 8)
return false;
4.幀總量id softwarek規定198幀
md2->frame_num = header->frame_num;
5.皮膚紋理總量設為0
md2->texture_num = 0;
4.多邊形總量
md2->polygon_num = header->polygon_num;
5.讀取幀頂點量
md2->vertex_num = header->vertex_num;
6.分配多邊形記憶體
md2->polygon_array = (MD2_POLYGON_PTR)malloc(md2->polygon_num*sizeof(MD2_POLYGON));
7.分配頂點記憶體
md2->vertex_array = (VECTOR3D_PTR)malloc(md2->frame_num * md2->vertex_num * sizeof(VECTOR3D));
8.分配紋理座標記憶體.以繪畫三角形進行排列
md2->textcoord_array = (VECTOR2D_PTR)malloc(md2->polygon_num * 3 * sizeof(VECTOR2D));
9.遍歷每一幀
for (int findex = 0; findex < md2->frame_num; ++findex){
MD2_FRAME_PTR frame;// 讀取幀
frame = (MD2_FRAME_PTR)(data+header->frame_offset + header->frame_size * findex);
10.遍歷每一頂點
for (int vindex = 0; vindex < md2->vertex_num; ++vindex){
VECTOR3D v ;
11.對頂點座標進行縮放和平移
v.x = frame->list[vindex].v[0] * frame->scale[0] + frame->translate[0];
v.y = frame->list[vindex].v[1] * frame->scale[1] + frame->translate[1];
v.z = frame->list[vindex].v[2] * frame->scale[2] + frame->translate[2];
12.跟據傳入參數進行縮放
if (scale != NULL)
v = v * scale;
13.反轉座標軸
if (flag & MD2_INVERT_X)
v.x = -v.x;
if (flag & MD2_INVERT_Y)
v.y = -v.y;
if (flag & MD2_INVERT_Z)
v.z = -v.z;
14.交換座標軸
float temp;
if (flag & MD2_SWAP_YZ)
SWAP(v.y, v.z, temp);
if (flag & MD2_SWAP_XZ)
SWAP(v.x, v.z, temp);
if (flag & MD2_SWAP_XY)
SWAP(v.x, v.y, temp);
15.將頂點插入列表中
md2->vertex_array[findex*md2->vertex_num + vindex] = v;
}
}
16.讀取紋理座標
MD2_TEXTCOORD_PTR textcoord = (MD2_TEXTCOORD_PTR)(data + header->textcoord_offset);
17.讀取多邊形
MD2_POLYGON_PTR polygon = (MD2_POLYGON_PTR)(data+header->polygon_offset);
18.遍歷多邊形
for (int pindex = 0; pindex<header->polygon_num; ++pindex){
if (flag & MD2_INVERT_WINDING_ORDER) {
19.反轉頂點環繞順序
md2->polygon_array[pindex].vertex_index[0] = polygon[pindex].vertex_index[2];
md2->polygon_array[pindex].vertex_index[1] = polygon[pindex].vertex_index[1];
md2->polygon_array[pindex].vertex_index[2] = polygon[pindex].vertex_index[0];
// 反轉紋理座標環繞順序
md2->polygon_array[pindex].textcoord_index[0] = polygon[pindex].textcoord_index[2];
md2->polygon_array[pindex].textcoord_index[1] = polygon[pindex].textcoord_index[1];
md2->polygon_array[pindex].textcoord_index[2] = polygon[pindex].textcoord_index[0];
}
else
{// 不改變頂點環繞順序
md2->polygon_array[pindex].vertex_index[0] = polygon[pindex].vertex_index[0];
md2->polygon_array[pindex].vertex_index[1] = polygon[pindex].vertex_index[1];
md2->polygon_array[pindex].vertex_index[2] = polygon[pindex].vertex_index[2];
// 不改變紋理座標環繞順序
md2->polygon_array[pindex].textcoord_index[0] = polygon[pindex].textcoord_index[0];
md2->polygon_array[pindex].textcoord_index[1] = polygon[pindex].textcoord_index[1];
md2->polygon_array[pindex].textcoord_index[2] = polygon[pindex].textcoord_index[2];
}
20.以繪畫順序讀取三角形頂點紋理座標,無需在提取幀是在生成.
int tindex0 = md2->polygon_array[pindex].textcoord_index[0];
int tindex1 = md2->polygon_array[pindex].textcoord_index[1];
int tindex2 = md2->polygon_array[pindex].textcoord_index[2];
21.讀取紋理座標轉換為0.0f~1.0f
md2->textcoord_array[pindex*3+0].u = (float)textcoord[tindex0].u / (float)header->skin_width;
md2->textcoord_array[pindex*3+0].v = (float)textcoord[tindex0].v / (float)header->skin_height;
md2->textcoord_array[pindex*3+1].u = (float)textcoord[tindex1].u / (float)header->skin_width;
md2->textcoord_array[pindex*3+1].v = (float)textcoord[tindex1].v / (float)header->skin_height;
md2->textcoord_array[pindex*3+2].u = (float)textcoord[tindex2].u / (float)header->skin_width;
md2->textcoord_array[pindex*3+2].v = (float)textcoord[tindex2].v / (float)header->skin_height;
}
22.遍歷每個頂點計算模型半徑
md2->radius_avg = 0;// 平均半徑
md2->radius_max = 0;// 最大半徑
for (int vindex = 0; vindex < header->vertex_num; ++vindex){
float dist;
dist = (float)sqrt(md2->vertex_array[vindex].x * md2->vertex_array[vindex].x +
md2->vertex_array[vindex].y * md2->vertex_array[vindex].y +
md2->vertex_array[vindex].z * md2->vertex_array[vindex].z);
md2->radius_avg = md2->radius_avg + dist;// 累加半徑
if (dist > md2->radius_max)
md2->radius_max = dist;// 最大半徑
}
23.計算平均半徑
md2->radius_avg = md2->radius_avg / header->vertex_num;//
23.載入默認動畫序列. md2_animations[]數組跟據上面動畫列表定義
for (int aindex = 0; aindex < (sizeof(md2_animations) / sizeof(MD2_ANIMATION)); ++aindex)
md2->animation_array[aindex] = md2_animations[aindex];
return true;
}
紋理需要另外載入,紋理高寬需為2x2x.如256256、128*128
bool Load_Texture_MD2(MD2_PTR md2, const char * path){
int index = md2->texture_num; // 索引
++md2->texture_num;// 紋理數量
Load_File_Texture(&md2->texture_array[index], path);// 載入
Bind_Image_Texture(&md2->texture_array[index]);// 綁定
return true;
}
3D模型動畫平滑運動需要幀插值.『當前幀』frame_curr帶有小數在0~127之間.按權重插值公式如下:
vi=v0(1-value) + v1value
逐幀提取函式:
void Extract_Frame_MD2(MD2_PTR md2,VECTOR3D_PTR vertex_array,VECTOR3D_PTR normal_array,float frame_curr){
MD2_POLYGON_PTR polyon;
int vindex;
1.判斷幀是否插值得到
float ivalue = frame_curr – (int)frame_curr;
if (ivalue == 0.0f) {//判斷是否為整數
2.若為整數則直接讀取
int frame = (int)frame_curr;
if (frame >= md2->frame_num)
frame = md2->frame_num – 1;
3.計算當前幀索引頂點偏移
int base = md2->vertex_num * frame;
4.遍歷每個多邊形
for (int pindex = 0, index = 0; pindex < md2->polygon_num; ++pindex, index= index+3){
5.讀取多邊形每個頂點
polyon = &md2->polygon_array[pindex];
vindex = polyon->vertex_index[0];
vertex_array[index+0] = md2->vertex_array[base + vindex];
vindex = polyon->vertex_index[1];
vertex_array[index + 1] = md2->vertex_array[base + vindex];
vindex = polyon->vertex_index[2];
vertex_array[index + 2] = md2->vertex_array[base + vindex];
6.計算三角形法線
Normal_VECTOR3D(&normal_array[pindex],&vertex_array[index + 0],&vertex_array[index + 1],&vertex_array[index + 2]);
}
}
else{
2.若有小數數則進行幀插值,讓動畫平滑
int frame0 = (int)frame_curr;
int frame1 = (int)frame_curr + 1;
if (frame0 >= md2->frame_num)
frame0 = md2->frame_num – 1;
if (frame1 >= md2->frame_num)
frame1 = md2->frame_num – 1;
int base0 = md2->vertex_num * frame0;
int base1 = md2->vertex_num * frame1;
3.偏曆三角形在兩幀之間插值計算頂點
for (int pindex = 0, index = 0; pindex < md2->polygon_num; ++pindex, index = index + 3){
4.讀取兩個多邊形頂點並行權重插值
polyon = &md2->polygon_array[pindex];
vindex = polyon->vertex_index[0];
vertex_array[index+0] = md2->vertex_array[base0 + vindex] * (1 – ivalue) +md2->vertex_array[base1 + vindex] * (ivalue);
vindex = polyon->vertex_index[1];
vertex_array[index + 1] = md2->vertex_array[base0 + vindex] * (1 – ivalue) +md2->vertex_array[base1 + vindex] * (ivalue);
vindex = polyon->vertex_index[2];
vertex_array[index + 2] = md2->vertex_array[base0 + vindex] * (1 – ivalue) + md2->vertex_array[base1 + vindex] * (ivalue);
5.計算三角形法線
Normal_VECTOR3D(&normal_array[pindex],&vertex_array[index + 0], &vertex_array[index + 1], &vertex_array[index + 2]);
}
}
}
載入MD2模型.讓MODEL3D
void Load_MD2_MODEL3D(MODEL3D_PTR model3D,MD2_PTR md2,int texture_index){
1.清零
memset(model3D, 0, sizeof(MODEL3D));
2.指向md2模型
model3D->md2 = md2;
3.分配每幀多邊形頂點記憶體
model3D->vertex_array = (VECTOR3D_PTR)malloc(md2->polygon_num * 3*sizeof(VECTOR3D));
4.分配每幀多邊形法線記憶體
model3D->normal_array = (VECTOR3D_PTR)malloc(md2->polygon_num * 3 * sizeof(VECTOR3D));
5.指向紋理
if (texture_index < md2->texture_num){
texture_index = md2->texture_num – 1;
model3D->texture = &md2->texture_array[texture_index];
}
}
設置模型動畫MD2有20個不同動作
void Set_Animation_MODEL3D(MODEL3D_PTR model3D,int anim,bool loop){
1.讀取MD2模型
MD2_PTR md2= model3D->md2;
2.設定當前動畫索引
model3D->anim = anim;
3.動畫是否循環播放
model3D->loop = loop;
4.動畫播放標記設為未完成
model3D->complete = false;
5.動畫
MD2_ANIMATION_PTR animation = md2->animation_array;
6.插幀頻率(0.0f~1.0f),1.0f表示不插幀
model3D->irate = animation[anim].irate;
7.當前幀
model3D->frame = animation[anim].start;
8.速度
model3D->speed = animation[anim].speed;
9.插幀計數器
model3D->count = 0;
10.提取動畫幀
Extract_Frame_MD2(model3D->md2,model3D->vertex_array, model3D->normal_array,model3D->frame);
}
在遊戲引擎中你需要更新動畫, time為時間間隔通過Get_Counter_FPS(&fps);獲得
void Update_MODEL3D(MODEL3D_PTR model3D,float time){
MD2_PTR md2 = model3D->md2;
MD2_ANIMATION_PTR animation = md2->animation_array;
1.計算動畫有幾多幀
int frame_num = animation->end – animation->start + 1;
2.計算每幀速度
float frame_speed = (float)frame_num / model3D->speed ;
3.當前幀帶小數以進行插值
model3D->frame = model3D->frame + frame_speed * time;
4.幀計數器控制插值
model3D->count = model3D->count + frame_speed * time;
5.判斷動畫是否播放完畢
if (model3D->frame > animation[model3D->anim].end) {
if (model3D->loop == MD2_LOOP) {// 循環播放動畫
model3D->count = 0;
model3D->frame = animation[model3D->anim].start;// 啟動幀
}
else{// 單次播放動畫
model3D->frame = animation[model3D->anim].end;// 結束幀
model3D->complete = true;// 以完成動作
}
}
if (model3D->count >= model3D->irate || model3D->count == 0){
model3D->count = 0;//清零
8.提取動畫幀
Extract_Frame_MD2(model3D->md2, model3D->vertex_array,model3D->normal_array,model3D->frame);
}
}
每幀都要對3D模型進行渲染.這裡使用頂點數組進行渲染.當前你可以逐個三角形進行渲染但是會較慢.
void Render_MODEL3D(MODEL3D_PTR model3D){
1.當前矩陣堆棧壓棧
glPushMatrix();
glTranslatef(model3D->pos.x, model3D->pos.y, model3D->pos.z);// 移動
glRotatef(model3D->rot.x, 1.0f, 0.0f, 0.0f); // 繞X軸旋轉
glRotatef(model3D->rot.y, 0.0f, 1.0f, 0.0f); // 繞Y軸旋轉
glRotatef(model3D->rot.z, 0.0f, 0.0f, 1.0f); // 繞Z軸旋轉
3.壓入當前屬性
glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT | GL_TEXTURE_BIT);
4.提取MD2模型
MD2_PTR md2 = model3D->md2;
5.綁定紋理
TEXTURE_PTR texture = model3D->texture;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture->ID);
5.啟用頂點數組
glEnableClientState(GL_VERTEX_ARRAY);
6.啟用紋理座標數組
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
7.啟用法線數組
glEnableClientState(GL_NORMAL_ARRAY);
8.指定頂點數組
glVertexPointer(3, GL_FLOAT, 0, model3D->vertex_array);
9.紋理座標
glTexCoordPointer(2, GL_FLOAT, 0, md2->textcoord_array);
10.三角形法線
glNormalPointer(GL_FLOAT,0, model3D->normal_array);
11.繪畫所有當前以啟用的頂點數組
glDrawArrays(GL_TRIANGLES, 0, md2->polygon_num * 3 );
12.啟用頂點數組
glDisableClientState(GL_VERTEX_ARRAY);
14.啟用紋理座標數組
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
15.啟用法線數組
glDisableClientState(GL_NORMAL_ARRAY);
16.彈出當前屬性
glPopAttrib();
17.當前矩陣堆棧出棧
glPopMatrix();
}
MD2載入器程式:下載

之前一值無法使用ALT鍵,因查找唔到其VK_ALT對應的『VIRTUAL CODE』,近日把WinXP切底拋棄改用Win10,發現很多程式均使用ALT鍵展示或隱藏MENU. 細想VK_ALT即等於VK_MENU,下面是使用ALT鍵展示與隱藏MENU源代碼
1.在resource.h加入
#define IDALT 1000
2.在resource.rc加入加速表,一定要加入ALT否則MENU會獲得焦點要按量下ALT鍵,另不要用VK_LMENU和VK_RMENU
ACCEL ACCELERATORS
BEGIN
VK_MENU, IDALT, VIRTKEY, ALT, NOINVERT
END
3.在main()修改消息循環
MSG msg;//消息 msg是WINDOWS放置下一個消息的存儲器,
HACCEL hAccel; // 加速鍵表的句柄
hAccel =::LoadAccelerators(main_instance,”ACCEL”); // 加速鍵表的句柄
while(GetMessage(&msg,NULL,0,0)) //從事件對列中獲得消息
{ //由 PostQuitMessage(0) 發送的WM_QUIT消息,被PeekMessage()檢測到
if(msg.message == WM_QUIT)
break;// 跳出主循環
if(!::TranslateAccelerator(main_window,hAccel,&msg))// 處理加速鍵表
{
TranslateMessage(&msg);//處理和轉換加速鍵.
DispatchMessage(&msg);//調用WinProc對消息進行處理,從MSG結構取的參數並傳遞.
}
}
4.在WinProc加入
if(msg == WM_COMMAND)
{ // 處理菜單命令
if (LOWORD(wParam) == IDALT)
{ main_menu = ::LoadMenuA(NULL,”MAIN_MENU”);// 主菜單
if (::GetMenu(main_window) == NULL)
::SetMenu(main_window, main_menu);// 設定菜單
else
::SetMenu(main_window, NULL);// 設定菜單
}
}


近日終於遠離最愛的VC6安裝VC2017,新增專案時居然無發現C/C++的選項,暈難道C已被拋棄?經一番鑽然才悟個中方法

在OpenGL輸出文字可用繪畫好的文本位圖,再繪畫上屏幕.也是遊戲製作通用手法.將基本ASCII文本存為16Bit*16Bit(32Byte)二進制點陣字體
指定位圖的繪畫位置
void glRasterPos2i(GLint x, GLint y);
繪畫位圖
void WINAPI glBitmap(
GLSizei width, GLSizei height, ASCII文本的寬和高這裡均為16
GLfloat xorig, GLfloat yorig,當前繪畫位置的偏移
GLfloat xmove, GLfloat ymove, 下次繪畫位置的增量
const GLubyte *bitmap); 二進制點陣字體
以位畫字符B的函式為例:
點陣字體的程序示例:下載

『Windows10 Update Assistant』又稱為『Windows 10 更新小幫手』會自動彈出下載並安裝更新.但更新後卻把我的『港版Win10』變為『台版Win10』更新時還不能保留原有程式.最煩的是經常自動彈出.即使卸載Uninstall後還是會自動安裝. 經一番研究只禁『Windows10 Update Assistant』自動彈出,而『Windows10 Update』仍在後臺自動更新系統


記憶體(RAM)容量對計算機性能起直接的影響,而另一個關鍵參數記憶體(RAM)帶寬(Bandwidth) ,帶寬越高與CPU之間交換數據更快,更有利提高計算機性能.
計算公式如下:
帶寬(Bandwidth)=工作頻率(DRAM Frequency)*位寬(DataWidth)
| 公式 | 簡介 | |
| 工作頻率Frequency | 工作頻率=記憶體頻率*通道數量 | 相當於車速 |
| 位寬(DataWidth) | SDRAM、DDR和DDR2、DDR3、DDR4的總線位寬均為64位 | 相當於路寬 |
可以通過命令行模式輸入『wmic memorychip』查看記憶體(RAM)的所有參數如上圖
| ConfiguredClockSpeed | DataWidth | Voltage | Speed | TypeDetail |
| 時鐘速度 | 位寬 | 電壓 | 工作頻率 | 記憶體容量 |
以DDR4-2400為例:
工作頻率:2400 MHz
位寬:64Bit=8Byte
例計算DDR4-2400記憶體(RAM)帶寬
2400MHz*64bit/8=19200 Mbyte/s=PC19200
例計算DDR400記憶體(RAM)帶寬
400MHz*64bit/8=3200Mbyte/s=PC3200






SATA端口固態硬盤(Solid State Drives)大多為2.5寸.可直接在筆記本電腦上使用.但在臺式機使用3.5寸硬碟.有些廠家會附帶有2.5寸轉3.5寸硬碟托架,但有些廠家就無提供.我地可以通過3D打印機做出硬碟托架.另需要準備六粒3mm六角螺母.產品的效果比在網上買的金屬版還要好





安裝電源
連接機箱前置面板插頭
| JFP1針腳 | 簡介 | JFP1針腳 | 簡介 |
| 1 | HDD LED+硬碟燈正極(紅色) | 2 | Power LED+電源燈正極(紅色) |
| 3 | HDD LED-硬碟燈負極 | 4 | Power LED-電源燈負極 |
| 5 | Reset Switch
重置開關 |
6 | Power Switch
電源開關 |
| 7 | 8 | ||
| 9 | Reserved(保留腳) | 10 | No Pin(無針腳) |
| JFP2針腳 | 簡介 | JFP2針腳 | 簡介 |
| 1 | Speaker-負極 | 2 | Buzzer-負極 |
| 3 | Buzzer-負極 | 4 | Speaker+正極(紅色) |
設定BIOS


本想購買華碩(Asus)PRIME B350-PLUS但細梯之下此主板尺寸是30.5CM23.7CM(6個鑼絲固定孔)非標準ATX大板,而華碩稍貴點的主板尺寸都是30.4CM24.3CM(9個鑼絲固定孔)標準ATX大板,光從這點就可梯出華碩小氣.有朋友總是迷信華碩認為它的質量就是最好.但多年經驗告訴我並非這樣.
之後注意到微星(MSI)B350 GAMING PLUS這塊標準的ATX大板.整塊主版以紅黑色設計給人感觀非常好.最重要介面齊全,連舊式的串口和並口都支援(需外接埠).小小失望的是缺小IDE介面,幸好有PCI介面可插IDE擴展卡.但我又怕拖慢開機速度.
| 介面 | 簡介 |
| CPU | 支持AM4封裝AMD RYZEN
我不太注重CPU速度.買左盒裝銳龍1500X/3.5GHz/4核. |
| 晶片組 | AMD B350晶片組 |
| 內存 | 4條DDR4內存插槽雙通道內存構架.
安裝四條單條16GB剛好64GB內存 |
| 擴展插槽 | 一條PCIe3.0x16插槽(需要安裝RYZEN(銳龍)CPU)
一條PCIe2.0x16插槽 兩條PCIe2.0x1插槽 兩條PCI插槽.是我買它最重要原因,可以安裝我的PCI創新聲卡 |
| USB後置面板
|
兩個USB2.0
四個USB3.1 一個USB3.1 TYPE-C 加上內置的USB插口,就無需再使用USB分線器.因為它經常接觸不良 |
| 交叉火力 | 支援安裝兩個相同的AMD顯卡 |
| 存儲 | 四個SATA 6Gb/s埠,安裝兩個硬盤一個DVD光驅剛剛夠用.
一個M.2介面 |



現在的CPU尺寸小而且針腳多.SOCKET AM4就有1331腳.若裝反會損毀CPU.是吾是想起SOCKET-1和SOCKET-A的年代呢.
安裝SOCKET AM4步驟



以前好似無買過盒裝的CPU.都是買散裝CPU外加個散熱器.因為現在網購方便乾脆買個盒裝CPU.本想買個Intel八代酷睿I5但需要300系列主機板.CPU同樣是1151腳.但卻要新的晶片組支援.Intel這種作為實在吾好.
繼而把目光轉向AMD RYZEN(銳龍)5-1500X.擁有4個核芯.基頻3.5GHz而且不鎖頻.就這點就比Intel有誠意.
有很吾識多任務操作系統原理的人認為CPU速度比核芯個數重要.其實並非這樣.每個進程(Process)都有一個主線程(thread).瀏覽器+播放機+圖形介面+後臺任務.分分幾十個進程(Process)等代CPU時間片運行.如果你有多CPU核芯操作系統就會均勻的給CPU核芯分配時片.如果遊戲或程式創建多個線程(thread).更能充分的發繪多核CPU性能.最明顯的是兩核芯CPU一出現就令Windows假死現象消失,因為在單CPU年代如果某個進程嚴重佔用CPU資源,Windows圖形介面就變得很慢很慢.
所以在未有多核CPU出現前.解決辦法是購買雙CPU的主版加兩個CPU.但多核芯系統依然比不上多核芯多CPU系統,因為單個CPU的主版的多個核芯同時間只有單個可以訪問內存(RAM).而多CPU的主版則可以同時訪問內存(RAM).但多核的CPU核芯同時間依然只有單核個可以訪問內存(RAM).但我之前幾塊雙CPU的主版都無法啟動!_!
| 性能 | 產品規格 |
| CPU | AM4介面1331針
AMD RYZEN銳龍1500X不集成顯卡 |
| 核芯 | 4芯核8線程 |
| 頻率 | 基頻3.5GHz最高3.7GHz |
| 緩存 | L2=2MB
L3=16MB |
| 風扇 | 原裝幽靈風扇 |
| 電壓 | 1.264V |
| 基頻(CPU Base Clock) | 100MHZ(基頻只有100超133有D希望) |


在市面上無論原裝機、相容機還是平板電腦.最高我只見過是16GB的記憶體(RAM).用戶採用最強勁CPU最大硬盤.而往往忽略記憶體(RAM)容量嚴重不足的重要性.
在現代操作系統把記憶體(RAM)空間劃分成一頁(PAGE)一頁(PAGE)使用,如果沒有足夠記憶體(RAM)空間,操作系統會把以載入數據的記憶體(RAM)分頁(PAGE)寫入磁盤(DISK),以騰出足夠記憶體(RAM)空間.以免造成記憶體(RAM)溢出.但問題是磁盤(DISK)讀寫比記憶體(RAM)慢內太多.在多個程式(APP)切換時記憶體分頁(RAM PAGE)要在記憶體(RAM)和磁盤(DISK)之間不斷傳送.在瀏覽較大的PDF文檔時記憶體(RAM)不斷分配(malloc)和釋放(free)也會造成很大的延時.現代的網絡瀏覽器耗記憶體(RAM)更為利害,網絡影片再打開若干個網站.而後在各瀏覽頁面切換造成很大的延時. CPU再快都幫唔到你. 所以記憶體(RAM) 係多多益善.
VASEKY雖然是雜牌但勝在價格低廉,而且還裝有散熱器.但記憶體(RAM)發熱量不大對於超頻意義不大.只用作美觀和保護晶片.但比起其它大廠有誠意得多.安裝四條16GB共64GB是我這塊B350主版的極限.
| 參數 | 簡介 |
| DDR4 | 2400MHZ(PC19200) |
| 電壓 | 1.2V |
| 容量 | 單條16GB |


本人對顯卡並無太多要求.能運行SolidWorks與Maya即可以.本想購買的XFX訊景R5-240無貨.而且又擔心4K影片支持.現在顯卡大多都被買去挖礦造成顯卡缺貨.幸好迪蘭恒進(ATALAND)RX550酷能4GB剛剛到貨馬上落單.
| 迪蘭恒進(ATALAND)RX550酷能4G | 簡介 |
| 晶片組 | RX550 |
| 內存 | 128BIT/DDR5/4GB |
| 輸出 | DVI-D/HDMI/DP |
現在的顯卡以4GB顯存起步,回想起我第一塊顯卡只有1MB的顯存.更加認證左.硬體只是過眼雲煙.演算法才能久流傳.
| 3DMARK11 | Entry(E) 1024×600 | Performance(P)1280×720 | Extrema(x)1920X1080 |
| 總分 | E9283 | P6332 | X1398 |
| 圖形分數 | 9527 | 5929 | 1241 |
| 物理分數 | 8958 | 8922 | 8960 |
| 結合分數 | 8390 | 6844 | 1688 |
| GT1 | 38.29幀 | 23.66幀 | 7.16幀 |
| GT2 | 45.03幀 | 26.75幀 | 6.94幀 |
| GT3 | 63.62幀 | 39.09幀 | 6.44幀 |
| GT4 | 30.75幀 | 20.04幀 | 3.31幀 |
| PT | 28.44幀 | 28.32幀 | 28.45幀 |
| CT | 39.03幀 | 31.83幀 | 7.85幀 |
大量的光照對於GPU要求還是有點高,Extrema測試基本吾上10幀.

因為VC是最好用的基於Windwos的 C編譯器,但如果配合快捷鍵使用將會事半功倍
| 快捷鍵 | 簡介 |
| CTRL+U | 選擇文本轉為小寫 |
| CTRL+SHIFT+U | 選擇文本轉為大寫 |
| CTRL+F | Find(查找字符串),但Find In Files顯示輸出欄Output比Find更好用 |
| CTRL+H | 替換字符串,VC最好用的文本編輯工具 |
| CTRL+C | 拷貝文本 |
| CTRL+V | 粘貼文本 |
| CTRL+Z | 撤消文本 |
| CTRL+Y | 恢復文本 |
| CTRL+A | 全選文本 |
| CTRL+R | 編輯資源文檔resources.rc |
| CTRL+S | 保存文檔,使用率最高的快捷鍵.良好使用習慣 |
| F7 | 編譯所有文檔 |
| CTRL+F7 | 編譯當前文檔 |
| ALT+F7 | 工程設置(Project Settings)較小使用 |
| ALT+2 | 顯示輸出欄Output |
| ALT+0 | 打開並把焦點切換到workspace |
| CTRL+W | 嚮導無用 |
| CTRL+G | Go to很小使用 |
| ATL+F2 | BOOKMARKS書簽 |
| CTRL+F2 | 標記 |
| F11 | 單步調試 |
| CTRL+F10 | Run to cursor運行到遊標 |
| F5 | 把修改項編譯並執行程式,或斷點後繼續執行,常用鍵之一. |
| CTRL+F5 | 不重新編譯只執行程式,用於編譯時長耐工程 |
| CTRL+ SHIFT+8 | View whitespace在空格加入或刪除”~”無用的工能只會讓人困惑. |
| CTRL+SHIFT+SPACE | Parameter info查看函式的參數,最好用的快捷鍵之一 |
| CTRL+T | Type Info查看函式或變量的類型信息,最好的用快捷鍵之一 |
| CTRL+ALT+T | 自動彈出全局變量與全局函式,按::也可自動彈出,最好用的快捷鍵之一 |

在DOS時代因為當時硬件品類小,程序直接控制硬件,但當硬件品類不斷增加,要對所有硬件進行支持變得不現實.所以便有OpenGL的出現,把硬件的支持交還給硬件開發商.
最初OpenGL由Silicon Graphics,Inc(SGI)開發的一個可以跨平臺使用的圖形編程接口, GL就是Graphics library的縮寫,最初用於UNIX工作站.
1992年OpenGL Architecture Review Board(ARB)委員會創建,由ATI,Compaq,Evans&Sutherland,Hewlett-packard,IBM,Intel,Intergraph,Nvidia,Microsoft,Silicon Graphics組成
1995年微軟在遊戲廠商進逼下不得已在WinNT中支持OpenGL
| 程式庫 | 簡介 | 下載點 |
| OpenGL | 標準OpenGL | 下載1或下載2 |
| GLU | (實用庫)OpenGL的補充
|
|
| GLUT | (OpenGL Utility Toolkit)應用工具包,與系統無關且便於移於移植.作為AUX庫的的替代品.
|
下載 |
下載並解壓後,更據文檔的擴展名拷貝到各自對應的VC目錄
| 文件 | 文檔類形 | 目錄 |
| include files | .h文檔 | C:\Program Files\Microsoft Visual Studio\VC98\Include\GL |
| Library files | .lib文檔 | C:\Program Files\Microsoft Visual Studio\VC98\Lib |
| Executable files | .dll文檔 | C:\Program Files\Microsoft Visual Studio\VC98\Bin |
| 程式頭文檔 | 程式庫文檔 | 程式二進制文檔 | 簡介 |
| gl.h | Opengl32.lib | OPENGL32.DLL | 標準OpenGL頭文件 |
| glu.h | Glu32.lib | GLU32.DLL | OpenGL實用工具庫 |
| glaux.h | GLAUX.LIB | OpenGL輔助函數庫 | |
| glut.h | glut.lib | glut.dll | OpenGL應用工具包 |
| glut32.lib | glut32.dll |

HASH(哈希碼)用於生成文件的指紋,如果兩個文件的哈希碼一致,則代表文件是相同的.令外也用於生成密碼指紋.此軟件用於生成文件的哈希碼,支持SHA1,SHA256,SHA384,SHA512,MD5,MD4,MD2,CRC32,CRC64.大部分的哈希校驗碼是我在2009年所寫.所以此軟件製作較順利.加入文件拖放和拷貝剪貼板,全部使用純C代碼所寫速度快,體積小.
Win32版下載:HASH

外鏈即指向您的網站的連結,它確定你從搜索引擎獲得多小流量.但要獲得大量的外鏈並不容易,而對於個人Blog(博客)應把精力集中于文章的質量而不是把精力用於增加外鏈.但個人博客主可以通過域名查詢網站增加外鏈,通過查詢域名流下查詢記錄,並產生一條指向你域名鏈接,而域名查詢網站首頁也會產生最新查詢鏈接,如果搜索引擎剛好來訪,你的外鏈就會增加.但天天查詢網站域名更會耗費大量精力,不過你可以製作全自動化域名查詢蜘蛛.下麵給出軟件的製作思路.

在撰寫與音樂相關的文章時會大量用到五線譜音符,但系統自帶的字體一般都不帶五線譜音符.幸好有專用的五線譜字體

域名與IP地址被牆之解決方案

要確定IP是否被牆可以通過路由跟蹤命令tracert確認
IP地址被牆一般是一個網段一個網段給被牆,並非單度你一個,建議你先等幾天.而且網站域名的IP地址一般不應頻繁更換,因為會影響搜索引擎排名.
Godaddy的獨立IP只屬於你使用,不會與別人分享,但網速並不會加快.其實Godaddy獨立IP加上旗艦版虛擬主機的價格,與Godaddy虛擬專用伺服器(VPS主機)的價格相差無幾.而且有3個獨立IP.

DNS是域名解析服務器,它有存有”域名”與對應”IP地址”的數據庫供把你查驗,是互聯網關鍵設施,在連接網絡時會自動獲取DNS服務器的IP地址,下面是查看步驟.
查看本機的DNS
登錄路郵器查看DNS
這個IP地址是由你的ISP(互聯網服務提供商)提供的.因為DNS經常遭受大規模攻擊.但其實你可以手動設置第三方DNS服務器.讓你網絡更加迅速和安全
下麵是共用DNS服務器IP地址:
| 首選 | 備用 | |
| Google共用DNS | 8.8.8.8 | 8.8.4.4 |
| 阿裏共用DNS | 223.5.5.5 | 223.6.6.6 |
設置本機DNS
設置路郵器DNS

Godaddy的主機價格低廉需度快,是我們博客主入門的首選.但今早發現網站未能訪問,發現在牆外是可以正常訪問的.
但若在牆內域名和IP都PING不通,而且Godaddy的DNS服務器DOMAINCONTROL.COM.從NS01到NS82也全都PING不通. PDNS 01到PDNS 14也一樣.以前是Godaddy的DNS服務器被牆,而這次梯來是IP地址大面積被牆,梯來只有更換IP地址或等幾天在作打算.
| Godaddy的DNS服務器列表 | IP |
| NS01.DOMAINCONTROL.COM | 216.69.185.1 |
| NS02.DOMAINCONTROL.COM | 208.109.255.1 |
| NS03.DOMAINCONTROL.COM | 216.69.185.2 |
| NS04.DOMAINCONTROL.COM | 208.109.255.2 |
| NS05.DOMAINCONTROL.COM | 216.69.185.3 |
| NS06.DOMAINCONTROL.COM | 208.109.255.3 |
| NS07.DOMAINCONTROL.COM | 216.69.185.4 |
| NS08.DOMAINCONTROL.COM | 208.109.255.4 |
| NS09.DOMAINCONTROL.COM | 216.69.185.5 |
| NS10.DOMAINCONTROL.COM | 208.109.255.5 |
| NS11.DOMAINCONTROL.COM | 216.69.185.6 |
| NS12.DOMAINCONTROL.COM | 208.109.255.6 |
| NS13.DOMAINCONTROL.COM | 216.69.185.7 |
| NS14.DOMAINCONTROL.COM | 208.109.255.7 |
| NS15.DOMAINCONTROL.COM | 216.69.185.8 |
| NS16.DOMAINCONTROL.COM | 208.109.255.8 |
| NS17.DOMAINCONTROL.COM | 216.69.185.9 |
| NS18.DOMAINCONTROL.COM | 208.109.255.9 |
| NS19.DOMAINCONTROL.COM | 216.69.185.10 |
| NS20.DOMAINCONTROL.COM | 208.109.255.10 |
| NS21.DOMAINCONTROL.COM | 216.69.185.11 |
| NS22.DOMAINCONTROL.COM | 208.109.255.11 |
| NS23.DOMAINCONTROL.COM | 216.69.185.12 |
| NS24.DOMAINCONTROL.COM | 208.109.255.12 |
| NS25.DOMAINCONTROL.COM | 216.69.185.13 |
| NS26.DOMAINCONTROL.COM | 208.109.255.13 |
| NS27.DOMAINCONTROL.COM | 216.69.185.14 |
| NS28.DOMAINCONTROL.COM | 208.109.255.14 |
| NS29.DOMAINCONTROL.COM | 216.69.185.15 |
| NS30.DOMAINCONTROL.COM | 208.109.255.15 |
| NS31.DOMAINCONTROL.COM | 216.69.185.16 |
| NS32.DOMAINCONTROL.COM | 208.109.255.16 |
| NS33.DOMAINCONTROL.COM | 216.69.185.17 |
| NS34.DOMAINCONTROL.COM | 208.109.255.17 |
| NS35.DOMAINCONTROL.COM | 216.69.185.18 |
| NS36.DOMAINCONTROL.COM | 208.109.255.18 |
| NS37.DOMAINCONTROL.COM | 216.69.185.19 |
| NS38.DOMAINCONTROL.COM | 208.109.255.19 |
| NS39.DOMAINCONTROL.COM | 216.69.185.20 |
| NS40.DOMAINCONTROL.COM | 208.109.255.20 |
| NS41.DOMAINCONTROL.COM | 216.69.185.21 |
| NS42.DOMAINCONTROL.COM | 208.109.255.21 |
| NS43.DOMAINCONTROL.COM | 216.69.185.22 |
| NS44.DOMAINCONTROL.COM | 208.109.255.22 |
| NS45.DOMAINCONTROL.COM | 216.69.185.23 |
| NS46.DOMAINCONTROL.COM | 208.109.255.23 |
| NS47.DOMAINCONTROL.COM | 216.69.185.24 |
| NS48.DOMAINCONTROL.COM | 208.109.255.24 |
| NS49.DOMAINCONTROL.COM | 216.69.185.25 |
| NS50.DOMAINCONTROL.COM | 208.109.255.25 |
| NS51.DOMAINCONTROL.COM | 216.69.185.26 |
| NS52.DOMAINCONTROL.COM | 208.109.255.26 |
| NS53.DOMAINCONTROL.COM | 216.69.185.27 |
| NS54.DOMAINCONTROL.COM | 208.109.255.27 |
| NS55.DOMAINCONTROL.COM | 216.69.185.28 |
| NS56.DOMAINCONTROL.COM | 208.109.255.28 |
| NS57.DOMAINCONTROL.COM | 216.69.185.29 |
| NS58.DOMAINCONTROL.COM | 208.109.255.29 |
| NS59.DOMAINCONTROL.COM | 216.69.185.31 |
| NS60.DOMAINCONTROL.COM | 208.109.255.31 |
| NS61.DOMAINCONTROL.COM | 216.69.185.32 |
| NS62.DOMAINCONTROL.COM | 208.109.255.32 |
| NS63.DOMAINCONTROL.COM | 216.69.185.42 |
| NS64.DOMAINCONTROL.COM | 208.109.255.42 |
| NS65.DOMAINCONTROL.COM | 216.69.185.43 |
| NS66.DOMAINCONTROL.COM | 208.109.255.43 |
| NS67.DOMAINCONTROL.COM | 216.69.185.44 |
| NS68.DOMAINCONTROL.COM | 208.109.255.44 |
| NS69.DOMAINCONTROL.COM | 216.69.185.45 |
| NS70.DOMAINCONTROL.COM | 208.109.255.45 |
| NS71.DOMAINCONTROL.COM | 216.69.185.46 |
| NS72.DOMAINCONTROL.COM | 208.109.255.46 |
| NS73.DOMAINCONTROL.COM | 216.69.185.47 |
| NS74.DOMAINCONTROL.COM | 208.109.255.47 |
| NS75.DOMAINCONTROL.COM | 216.69.185.48 |
| NS76.DOMAINCONTROL.COM | 208.109.255.48 |
| NS77.DOMAINCONTROL.COM | 216.69.185.49 |
| NS78.DOMAINCONTROL.COM | 208.109.255.39 |
| NS79.DOMAINCONTROL.COM | NULL |
| NS80.DOMAINCONTROL.COM | NULL |
| NS81.DOMAINCONTROL.COM | 216.69.185.81 |
| NS82.DOMAINCONTROL.COM | 208.109.255.81 |
| PDNS 01.DOMAINCONTROL.COM | 216.69.185.50 |
| PDNS 02.DOMAINCONTROL.COM | 208.109.255.50 |
| PDNS 03.DOMAINCONTROL.COM | 216.69.185.51 |
| PDNS 04.DOMAINCONTROL.COM | 208.109.255.51 |
| PDNS 05.DOMAINCONTROL.COM | 216.69.185.52 |
| PDNS 06.DOMAINCONTROL.COM | 208.109.255.52 |
| PDNS 07.DOMAINCONTROL.COM | 216.69.185.53 |
| PDNS 08.DOMAINCONTROL.COM | 208.109.255.53 |
| PDNS 09.DOMAINCONTROL.COM | 216.69.185.54 |
| PDNS 10.DOMAINCONTROL.COM | 208.109.255.54 |
| PDNS 11.DOMAINCONTROL.COM | 216.69.185.55 |
| PDNS 12.DOMAINCONTROL.COM | 208.109.255.55 |
| PDNS 13.DOMAINCONTROL.COM | 216.69.185.56 |
| PDNS 14.DOMAINCONTROL.COM | 208.109.255.56 |

應用程序的運行都先載入記憶體(RAM),如果記憶體(RAM)不足在DOS時代會溢出,而Windows時代側把記憶體(RAM)數據寫入硬盤,所以記憶體(RAM)容量比CPU更影響多線程操作系統運行.在64位操作系統的今天4GB起步去到16GB已是頂配.這是用家只看重CPU的速度,而忽略記憶體(RAM)的重要性.記憶體價高一但換代就要全部淘汰也是原因之一.如果資金充足以今天硬件DDR4配備64GB記憶體(RAM)是必要的.
隨著計算機的發展,CPU的外頻越來越高,記憶體RAM的頻率也隨之跟進,在SDRAM時代CPU外頻等於記憶體(RAM)頻率,而記憶體品質也決定電腦的穩定性.
由記憶體引發無法開機的解決方案
下表是我搜集記憶體(RAM)型好的腳數和點壓
| 分類 | 電壓 | 單面雙面腳數 | 缺口左側腳數 | 缺口右側腳數 |
| EDO | 5V | 36腳/72腳 | 36腳 | 36腳 |
| SDRAM | 3.3V | 84腳/168腳(有兩個缺口) | 10腳/30腳 | 44腳 |
| DDR1 | 2.5V | 92腳/184腳 | 52腳 | 40腳 |
| DDR2 | 1.8V | 120腳/240腳 | 64腳 | 56腳 |
| DDR3 | 1.5 | 120腳/240腳 | 72腳 | 48腳 |
| DDR4 | 1.2 | 142腳/284腳 | 75腳 | 67腳 |
下表是我搜集記憶體(RAM)型號對應頻率
| 分類 | 型號 | 帶寬即是數據傳送率(MBps) | 核心頻率MHz | 等效頻率MHz |
| EDO | 66MHz | 66MHz | ||
| SDRAM | PC-66 | 66MHz | 66MHz | |
| PC-100 | 100MHz | 100MHz | ||
| PC-133 | 133MHz | 133MHz | ||
| DDR1 | DDR266 | PC-2100 | 133MHz | 266 MHz |
| DDR333 | PC-2700 | 166 MHz | 333 MHz | |
| DDR400 | PC-3200 | 200 MHz | 400 MHz | |
| DDR2 | DDRII533 | PC-4300 | 133 MHz | 533 MHz |
| DDRII667 | PC-5300 | 166 MHz | 666 MHz | |
| DDRII800 | PC-6400 | 200 MHz | 800 MHz | |
| DDR3 | DDRIII1066 | PC-8500 | 133 MHz | 1066 MHz |
| DDRIII1333 | PC-10600 | 166 MHz | 1333MHz | |
| DDRIII1600 | PC-12800 | 200 MHz | 1600 MHz | |
| DDR4 | DDRIV2133 | PC-17064 | 133 MHz | 2133 MHz |
| DDRIV2400 | PC-19200 | 150 MHz | 2400 MHz | |
| DDRIV2666 | PC-21300 | 166 MHz | 2666 MHz | |
| DDRIV2800 | PC-22400 | 175 MHz | 2800 MHz | |
| DDRIV3000 | PC-24000 | 188 MHz | 3000 MHz |

電視機要輸出到功放音響通常是使用AV立體聲,但現在的電視機有些牌子就沒有AV立體聲輸出,取而代之的是代之是使用藍牙連接音響,但音響功放大多沒有藍牙,就算有我也不太建議使用,因為我睇過很多藍牙音響長時間連接會自動與其它設備連接,或者播放其它藍牙設備聲音或短暫失去連接.
幸好所有電視機都會有S/PDIF數字音頻輸出,它有光釺和同軸兩個版本,需要S/PDIF的同軸線與AV綫是一樣的但它輸出的數字信號,而AV是模擬信號,要連接音響功放你需要S/PDIF轉AV的轉換器,這種轉換器大多數使用直流5V電源,一端接S/PDIF,樂視,夏普,LG使用光釺線,而小米,海信使用同軸線,另一端接AV輸出.有些轉換器帶有3.5MM音頻AV輸出
在網絡買最只28蚊,實測只有單聲道輸出.

因為暑熱所以搬離屋企,安裝左”有線電視”的寬帶(139.gd),但總是發覺BT(BitTorrent)下載時比在屋企下載難,當時想是寬帶是內網的問題.但按使用BitComet是發現無法端口阻塞.”你的監聽端口無法被外網用戶連接,你的下載速度可能會受到影響,請檢查防火牆及NAT網關設置”並且”DHT已連接節點為0”
這講明你只能主動鏈接她人,而她人就無法鏈接你,而且DHT協議也是需要監聽端口.因為本人多年前寫過BT下載程序,這種情況當然不是本機的監聽端口無法打開,而網關(路郵)無幫你作端口影射.你需要在網關(路郵)啟用UPNP,這個協議可以幫助由程序向網關(路郵)請求端口影射.
以我這台”有線電視”的機頂盒為例啟動UPNP
有部分軟件並非自已生成UPNP連接,而是使用Windows自帶的服務.你需令外啟用.
這樣你才能被沒有啟用UPNP的用戶peer連接,獲的更快的下速度.


我老竇屋企台20年前29寸電視終於離開左我,需要穩一台質量性能都要過得去電視.鑒於LCD屏幕都是進口, 話買杂牌子也可了, 睇咗多個杂牌子RAM與硬盤都較小.唯有小米人工智能語音版有內存2GB硬盤32GB.在官網3599單價+200運費=3799元.但要20天內發貨.
於是與老竇去小米的專賣店梯下臺實機,雖然這台吾是無邊框設計但梯起來還可以.與是走去櫃檯問價格,報價2499單價+200運費=2699元.大驚以為店員搞錯細問之下,原來小米專賣店特權降價1100最後今晚,與老竇商量後馬上下單,8月27號晚落單8月30號下午送到,小米自有車所以無需經外面物流公司.
腳架與專賣店唔一樣在果度睇是一對叉,不過與官網上是一致.音頻輸出擴音機比較麻煩.手頭上無S/PDIF線,使用HDMI轉AV需要買轉換器,而藍牙大部分的功放都無這個接口.只能用個藍牙小音箱試左下.
清晰度要看最小矢量字體.而影片因為屏幕較大看分辯率細的效果吾會好,但如果片源分辯率高它的效果就可以梯出來.另外分辨率較高的片都要付費.較新都要VIP!暈…令外它帶有高頻頭可以自已裝條魚骨天線.
另外語音功能按住搖控器第二個按扭講話但意義不大

Maya在載入.tif文件時會彈出下麵的警告:
TIFFReadDirectory: Warning, foo: unknown field with tag 37724 (0x935c) encountered.
TIFFReadDirectory: Warning, D:/Maya/sourceimages/bbg.tif: unknown field with tag 37724 (0x935c) encountered.
這是Maya的.tif文件載入器(LIBTIFF)讀取到未能識別的數據塊,但為什麼別人的製作的.tif文件就無種警告呢?按我下麵方法就可導出無警告的.tif文件
這樣Maya載入.ttf文件就吾回彈出警告

IBM-T60P是IBM賣掉其ThinkPad最後一款型號,雖然歷史悠久,但依然使用,只因冇銀更換.主要問題係影片播放時不同步.播放Flash FLV/.F4V文件影片慢過聲音.播放RMVB文件唔流暢每隔幾秒就停一停.換其它播放器也一樣,它自帶獨立顯卡ATI Mobility FireGL V5200 顯存512M PCIExpress X16接口.理應唔會造成這種現象.
主要問題係在驅動上,在ThinkPad網站上下載驅動太差,需要ATI Mobility Radeon 系列移動顯卡移動版催化劑驅動,才可能解决這個問題.最好安裝是集成了控制中心驅動版本,安裝8.4版需先安裝微軟Microsoft.NET Framework組件

ASCII表完整版
ASCII(American Standard Code for Information Interchange)美國資訊交換標準代碼用於文本的資料編碼系統.
數字0–31分配給控制字元,用於控制像印表機等一些週邊設備
數字32–126分配給鍵盤上的字從
數字127代表DELETE 命令.
數字48-57代表0-9
數字65-90代表A-Z
數字97-122代表a-z
數字128-255为扩展,增加特殊符号字符,外来语字母和图形符号.
ASCII表是每本電腦的書籍都應附帶,特別是遊戲設計,但現實是大部分的書籍都不包含,下我給出字符從0~127,127~255的完全注釋的ASCII表,也方便查閱,另為我也給出以C語言ASCII輸出表
void ASCII()
{
char str[1024];
for(int i=0;i<256;++i)
{
::memset(str,0,1024);//清零
str[0] = i;
str[1] = ‘\r’;
str[2] = ‘\n’;
str[4] = NULL;
if(i == 0)
str[0] = ‘ ‘;// 空格
::printf(“十進位(DEC)=%03i 十六進位(HEX)=0x%02X ASCII字符=%s”,i,i,str);
}
return ;
}
| 十進制(DEC) | 十六進制(HEX) | ASCII字符 | 簡介 |
| 0 | 0x00 | 空格NUL(null) | |
| 1 | 0x01 | 標題開始 SOH(start of headling) | |
| 2 | 0x02 | [1] | 正文開始 STX (start of text) |
| 3 | 0x03 | 正文結束 ETX (end of text) | |
| 4 | 0x04 | 傳輸結束 EOT (end of transmission) | |
| 5 | 0x05 | 請求 ENQ (enquiry) | |
| 6 | 0x06 | 收到通知 ACK (acknowledge) | |
| 7 | 0x07 | 響鈴 BEL (bell) | |
| 8 | 0x08 | 退格 BS (backspace) | |
| 9 | 0x09 | 水準跳位字元 HT (horizontal tab) | |
| 10 | 0x0A | 換行鍵 LF (NL line feed, new line) | |
| 11 | 0x0B | 垂直跳位字元 VT (vertical tab) | |
| 12 | 0x0C | 換頁鍵 FF (NP form feed, new page) | |
| 13 | 0x0D | 回車鍵 CR (carriage return) | |
| 14 | 0x0E | 不用切換 SO (shift out) | |
| 15 | 0x0F | 啟用切換 SI (shift in) | |
| 16 | 0x10 | 資料連結轉義DLE (data link escape) | |
| 17 | 0x11 | 設備控制1 DC1 (device control 1) | |
| 18 | 0x12 | 設備控制2 DC2 (device control 2) | |
| 19 | 0x13 | 設備控制3 DC3 (device control 3) | |
| 20 | 0x14 | 設備控制4 DC4 (device control 4) | |
| 21 | 0x15 | 拒絕接收 NAK (negative acknowledge) | |
| 22 | 0x16 | 同步空閒 SYN (synchronous idle) | |
| 23 | 0x17 | 傳輸塊結束 ETB (end of trans. block) | |
| 24 | 0x18 | 取消 CAN (cancel) | |
| 25 | 0x19 | EM (end of medium) | |
| 26 | 0x1A | 替補 SUB (substitute) | |
| 27 | 0x1B | 溢出 ESC (escape) | |
| 28 | 0x1C | 檔分割符 FS (file separator) | |
| 29 | 0x1D | 分組符 GS (group separator) | |
| 30 | 0x1E | 記錄分離符 RS (record separator) | |
| 31 | 0x1F | 單元分隔符號 US (unit separator) | |
| 32 | 0x20 | 空格 (space) | |
| 33 | 0x21 | ! | 嘆號 |
| 34 | 0x22 | “ | 雙引號 |
| 35 | 0x23 | # | 井號 |
| 36 | 0x24 | $ | 美元符 |
| 37 | 0x25 | % | 百分號 |
| 38 | 0x26 | & | 和號 |
| 39 | 0x27 | ‘ | 閉單引號 |
| 40 | 0x28 | ( | 開括弧 |
| 41 | 0x29 | ) | 閉括弧 |
| 42 | 0x2A | * | 星號 |
| 43 | 0x2B | + | 加號 |
| 44 | 0x2C | , | 逗號 |
| 45 | 0x2D | – | 減號/破折號 |
| 46 | 0x2E | . | 句號 |
| 47 | 0x2F | / | 斜杠 |
| 48 | 0x30 | 0 | |
| 49 | 0x31 | 1 | |
| 50 | 0x32 | 2 | |
| 51 | 0x33 | 3 | |
| 52 | 0x34 | 4 | |
| 53 | 0x35 | 5 | |
| 54 | 0x36 | 6 | |
| 55 | 0x37 | 7 | |
| 56 | 0x38 | 8 | |
| 57 | 0x39 | 9 | |
| 58 | 0x3A | : | 冒號 |
| 59 | 0x3B | ; | 分號 |
| 60 | 0x3C | < | 小於 |
| 61 | 0x3D | = | 等號 |
| 62 | 0x3E | > | 大於 |
| 63 | 0x3F | ? | 問號 |
| 64 | 0x40 | @ | 電子郵件符號 |
| 65 | 0x41 | A | |
| 66 | 0x42 | B | |
| 67 | 0x43 | C | |
| 68 | 0x44 | D | |
| 69 | 0x45 | E | |
| 70 | 0x46 | F | |
| 71 | 0x47 | G | |
| 72 | 0x48 | H | |
| 73 | 0x49 | I | |
| 74 | 0x4A | J | |
| 75 | 0x4B | K | |
| 76 | 0x4C | L | |
| 77 | 0x4D | M | |
| 78 | 0x4E | N | |
| 79 | 0x4F | O | |
| 80 | 0x50 | P | |
| 81 | 0x51 | Q | |
| 82 | 0x52 | R | |
| 83 | 0x53 | S | |
| 84 | 0x54 | T | |
| 85 | 0x55 | U | |
| 86 | 0x56 | V | |
| 87 | 0x57 | W | |
| 88 | 0x58 | X | |
| 89 | 0x59 | Y | |
| 90 | 0x5A | Z | |
| 91 | 0x5B | [ | 開方括號 |
| 92 | 0x5C | \ | 反斜杠 |
| 93 | 0x5D | ] | 閉方括號 |
| 94 | 0x5E | ^ | 脫字元 |
| 95 | 0x5F | _ | 下劃線 |
| 96 | 0x60 | ` | 開單引號 |
| 97 | 0x61 | a | |
| 98 | 0x62 | b | |
| 99 | 0x63 | c | |
| 100 | 0x64 | d | |
| 101 | 0x65 | e | |
| 102 | 0x66 | f | |
| 103 | 0x67 | g | |
| 104 | 0x68 | h | |
| 105 | 0x69 | i | |
| 106 | 0x6A | j | |
| 107 | 0x6B | k | |
| 108 | 0x6C | l | |
| 109 | 0x6D | m | |
| 110 | 0x6E | n | |
| 111 | 0x6F | o | |
| 112 | 0x70 | p | |
| 113 | 0x71 | q | |
| 114 | 0x72 | r | |
| 115 | 0x73 | s | |
| 116 | 0x74 | t | |
| 117 | 0x75 | u | |
| 118 | 0x76 | v | |
| 119 | 0x77 | w | |
| 120 | 0x78 | x | |
| 121 | 0x79 | y | |
| 122 | 0x7A | z | |
| 123 | 0x7B | { | 開花括弧 |
| 124 | 0x7C | | | 垂線 |
| 125 | 0x7D | } | 閉花括弧 |
| 126 | 0x7E | ~ | 波浪號 |
| 127 | 0x7F | 刪除DEL(DELETE) | |
| 128 | 0x80 | Ç | Ccedil |
| 129 | 0x81 | ü | uuml |
| 130 | 0x82 | é | eacute |
| 131 | 0x83 | â | circ |
| 132 | 0x84 | ä | auml |
| 133 | 0x85 | à | agrave |
| 134 | 0x86 | å | aring |
| 135 | 0x87 | ç | ccedil |
| 136 | 0x88 | ê | ecirc |
| 137 | 0x89 | ë | euml |
| 138 | 0x8A | è | egrave |
| 139 | 0x8B | ï | iuml |
| 140 | 0x8C | î | icirc |
| 141 | 0x8D | ì | igrave |
| 142 | 0x8E | Ä | Auml |
| 143 | 0x8F | Å | ring |
| 144 | 0x90 | É | Eacute |
| 145 | 0x91 | æ | aelig |
| 146 | 0x92 | Æ | AElig |
| 147 | 0x93 | ô | ocirc |
| 148 | 0x94 | ö | ouml |
| 149 | 0x95 | ò | ograve |
| 150 | 0x96 | û | ucirc |
| 151 | 0x97 | ù | ugrave |
| 152 | 0x98 | ÿ | yuml |
| 153 | 0x99 | Ö | Ouml |
| 154 | 0x9A | Ü | Uuml |
| 155 | 0x9B | ¢ | 美分(cent) |
| 156 | 0x9C | £ | 英磅(pound) |
| 157 | 0x9D | ¥ | 日元(yen) |
| 158 | 0x9E | ₧ | |
| 159 | 0x9F | ƒ | |
| 160 | 0xA0 | á | aacute |
| 161 | 0xA1 | í | iacute |
| 162 | 0xA2 | ó | oacute |
| 163 | 0xA3 | ú | uacute |
| 164 | 0xA4 | ñ | ntilde |
| 165 | 0xA5 | Ñ | Ntilde |
| 166 | 0xA6 | ª | |
| 167 | 0xA7 | º | |
| 168 | 0xA8 | ¿ | |
| 169 | 0xA9 | ⌐ | |
| 170 | 0xAA | ¬ | |
| 171 | 0xAB | ½ | |
| 172 | 0xAC | ¼ | |
| 173 | 0xAD | ¡ | |
| 174 | 0xAE | « | |
| 175 | 0xAF | » | |
| 176 | 0xB0 | ░ | |
| 177 | 0xB1 | ▒ | |
| 178 | 0xB2 | ▓ | |
| 179 | 0xB3 | │ | |
| 180 | 0xB4 | ┤ | |
| 181 | 0xB5 | ╡ | |
| 182 | 0xB6 | ╢ | |
| 183 | 0xB7 | ╖ | |
| 184 | 0xB8 | ╕ | |
| 185 | 0xB9 | ╣ | |
| 186 | 0xBA | ║ | |
| 187 | 0xBB | ╗ | |
| 188 | 0xBC | ╝ | |
| 189 | 0xBD | ╜ | |
| 190 | 0xBE | ╛ | |
| 191 | 0xBF | ┐ | |
| 192 | 0xC0 | └ | |
| 193 | 0xC1 | ┴ | |
| 194 | 0xC2 | ┬ | |
| 195 | 0xC3 | ├ | |
| 196 | 0xC4 | ─ | |
| 197 | 0xC5 | ┼ | |
| 198 | 0xC6 | ╞ | |
| 199 | 0xC7 | ╟ | |
| 200 | 0xC8 | ╚ | |
| 201 | 0xC9 | ╔ | |
| 202 | 0xCA | ╩ | |
| 203 | 0xCB | ╦ | |
| 204 | 0xCC | ╠ | |
| 205 | 0xCD | ═ | |
| 206 | 0xCE | ╬ | |
| 207 | 0xCF | ╧ | |
| 208 | 0xD0 | ╨ | |
| 209 | 0xD1 | ╤ | |
| 210 | 0xD2 | ╥ | |
| 211 | 0xD3 | ╙ | |
| 212 | 0xD4 | Ô | |
| 213 | 0xD5 | ╒ | |
| 214 | 0xD6 | ╓ | |
| 215 | 0xD7 | ╫ | |
| 216 | 0xD8 | ╪ | |
| 217 | 0xD9 | ┘ | |
| 218 | 0xDA | ┌ | |
| 219 | 0xDB | █ | |
| 220 | 0xDC | ▄ | |
| 221 | 0xDD | ▌ | |
| 222 | 0xDE | ▐ | |
| 223 | 0xDF | ▀ | |
| 224 | 0xE0 | α | 阿爾法(Alpha) |
| 225 | 0xE1 | ß | 贝塔(beta) |
| 226 | 0xE2 | Γ | Gamma |
| 227 | 0xE3 | π | 圆周率(pi) |
| 228 | 0xE4 | Σ | sigma |
| 229 | 0xE5 | σ | sigma |
| 230 | 0xE6 | µ | mu |
| 231 | 0xE7 | τ | tau |
| 232 | 0xE8 | Φ | PHi |
| 233 | 0xE9 | Θ | Theta |
| 234 | 0xEA | Ω | 欧米伽(Omega) |
| 235 | 0xEB | δ | Delta |
| 236 | 0xEC | ∞ | 無窮 |
| 237 | 0xED | φ | phi |
| 238 | 0xEE | ε | epsilon |
| 239 | 0xEF | ∩ | |
| 240 | 0xF0 | ≡ | |
| 241 | 0xF1 | ± | |
| 242 | 0xF2 | ≥ | |
| 243 | 0xF3 | ≤ | |
| 244 | 0xF4 | ⌠ | |
| 245 | 0xF5 | ⌡ | |
| 246 | 0xF6 | ÷ | |
| 247 | 0xF7 | ≈ | |
| 248 | 0xF8 | ≈ | |
| 249 | 0xF9 | ∙ | |
| 250 | 0xFA | · | |
| 251 | 0xFB | √ | |
| 252 | 0xFC | ⁿ | |
| 253 | 0xFD | ² | |
| 254 | 0xFE | ■ | |
| 255 | 0xFF | ÿ |


求花花
今在歐陽家群出現一條幼稚園大班的算術題,題目是一張圖.圖中的花具有權重相加合得一定的數值,三種花必須符合以下三個條件
求: 黃花+紅花*藍花/5*4=?
因為電腦是科學家經過幾百才得到強大運算器,下面我使用電腦求解這個問題,演算法超簡單無經過優化. 黃花1紅花權重20,五瓣花藍花權重5,四瓣藍花權重4 ,答案是81
//——————————————————————–
// 求花花
//——————————————————————–
int flowers()
{
int red=0;// 紅花
int blue = 0;// 藍花
int yellow=0;// 黃花
int x=0;
while(true)
{
if((red + red + red == 60) )
{
if( red + blue + blue == 30)
{
if(blue – yellow*2 == 3 )
{
x = yellow + red * (blue/5*4);
break;// 求得答案
}
else
{
++yellow;// 黃花
}
}
else
{
++blue;//藍花
}
}
else
{
++red;// 紅花
}
}//END WHILE
return x;
}


因本人的筆記本IBM-T60P以有十幾年歷史本應退役.但因為資金緊張只能通過更換硬碟延長使用壽命(原配的100GB硬碟不夠存儲),上世紀存活下來的硬碟廠家只剩下西數和希捷,我以負責態度買硬就應買希捷,應為硬碟再貴也不及硬碟內的資料貴.
現在硬碟三種類型
在這三者中固態混合型硬碟(SSHD),在機械硬碟和固態硬碟集合了兩者的優點價格和性能.我這款500GB固態混合型硬碟帶有8GB的SSD模組,當某個資料經常被讀或寫,就被視為熱點資料,那麼這個資料回被寫如SSD模組並且與HDD是鏡像,有點像RAIN0, 這就是希捷獨門絕技Adaptive Memory技術.
這款500GB硬碟的厚度只有7MM比原薄多了,外加64M記憶體.5400轉很靜. 我拆下來的100GB是7200轉超響的是要退役了.其實硬碟速度並太重要,如果你記憶體太小在快的硬碟也無用.

SolidWorks的PhotoView360的3D模型高級渲染
在SolidWorks內置了PhotoView360軟見。它可用於製作產品的渲染效果圖,PhotoView360其實是動態連接庫(.DLL),並非度立執行檔(.EXE).

如果網速小於網路運營商標稱才能講網速慢,但網路運營商標稱的網速是以BIT為單位.而我們常用的單位BYTE,KB,MB,GB所以要轉換單位.
1BYTE=8BIT
1KB=1024BYTE
1MB=1024KB
1GB=1024MB
我們計算常見的網速
2M(bit)=102410242(bit)=262144(BYTE)=256(KB)
20M(bit)= 1024102420(bit)= 2621440 (BYTE)=2560(KB)=2.5MB
100M(bit)=10241024100(bit)= 13107200(BYTE)=12800(KB)=12.5(MB)
連接下面的URL進行網速測試,或者使用路由器內置網速測試.
http://netreport.sh.189.cn/speed/main.html

今日見老豆在看微信,而且不停的在紙上寫數位並按計算機,原來是三舅父群裏發了一條數學題,這是條數學題求筐裏雞蛋的個數,我一口答應由我來算,題目我在下面給出,這種題目非常適合使用電腦進行碰撞求結果.常細的C語言演算法我在下面給出,演算法思路就是雞蛋個數逐次加一,所有條件都附合就得出接果,我果台老爺機IBM-T60P瞬間就給我答案1449,我將結果告訴我老豆他立馬發上群威一威.
一筐雞蛋:求筐裏雞蛋的個數
一個一個拿,正好拿完.
二個二個拿,還剩一個.
三個三個拿,正好拿完.
四個四個拿,還剩一個.
五個五個拿,還差一個.
六個六個拿,還剩三個.
七個七個拿,正好拿完.
八個八個拿,還剩一個.
九個九個拿,正好拿完.
//——————————————————————–
//一筐雞蛋
//——————————————————————–
int egg()
{
int x[9];
int _x;// 雞蛋個數
int c;//拿蛋的次數
_x = 0;// 雞蛋個數
while(1)
{
++_x;// 雞蛋個數加一
for(c = 0; 1c <= _x; ++c)
x[0] = 1c;
for(c = 0; 2c+1 <= _x; ++c)
x[1] = 2c+1;
for(c = 0; 3c <= _x; ++c)
x[2] = 3c;
for(c = 0; 4c+1 <= _x; ++c)
x[3] = 4c+1;
for(c = 0; 5c-1 <= _x; ++c)
x[4] = 5c-1;
for(c = 0; 6c+3 <= _x; ++c)
x[5] = 6c+3;
for(c = 0; 7c <= _x; ++c)
x[6] = 7c;
for(c = 0; 8c+1 <= _x; ++c)
x[7] = 8c+1;
for(c = 0; 9c <= _x; ++c)
x[8] = 9c;
if(_x == x[0] &&
_x == x[1] &&
_x == x[2] &&
_x == x[3] &&
_x == x[4] &&
_x == x[5] &&
_x == x[6] &&
_x == x[7] &&
_x == x[8] )
break;
}
return _x;
}

在網路上會有很多試用優惠的機會,而在蘇甯易購買的這款立體聲音樂耳機原價19元,試用優惠價只需6元,而且還未免運費,在街邊上買的耳機最偏宜也要10元,而且是簡包裝,而這款耳機軟塞套戴上去很舒服,因為耳機線在拉扯時會很容易扯斷,在貴也一樣的哦.

在網路上會有很多試用優惠,在蘇甯易購上這款多功能讀卡器原價19元,試用優惠只需8元,而且還未免運費,金士頓一款讀卡器則需要19元,如果品質可以的話性價比極高,支援多款SD記憶體卡.共有3個卡槽相容性強.
SD接口:SD/SDHC/SDXC/MMC II/RS MMC
TF接口:MicroSD/MicroSDCH/MicroSDXC
MS接口:MS Pro/MS Pro Duo/Ms Pro MG


因為本人的IBM-T60P是多年前在淘寶購買的二手貨,這台電腦已十幾年歷史,本應退役進入博物館安享晚年,可是本人饢中羞愧,拿不出錢購買新的電腦設備.其硬碟只有120GB所以想拆下原裝的DVD-ROM光碟機, 加裝光碟機硬碟托架後再買個1TB的希捷硬碟.
光碟機硬碟托架在蘇甯易購購入支援STAT3,安裝時其前面版無法安裝,因為IBM有個缺口位,硬碟也無法時別.硬碟是東芝移動固態硬碟,它有個三通道開關用於相容不同的電腦
左側A通道:惠普,索尼
中間B通道:戴爾,IBM
右側C通道:其他品牌
不幸的是三個通道都無法使用,電腦無法通過光碟機為升級硬碟.
Dell Inspiron 15 3000 Series評測

因為媽咪去美國探她大佬隨手買台Dell Inspiron 15 3000 Series 未含稅275美元. 稅率為8%.平常媽咪自已使用.不過對於還在使用二手IBM-T60P WinXP我嚟講是見識高科技.
電源開關在鍵盤右上角.CPU是Intel Core i3 515U主頻2.1GHz發熱量很低,與T60P熱到死機形成鮮明對比,電池續航時間4小時,T60P安裝9節電芯也只能2小時.最重要重量輕外出方便.4GB-DDR3記憶體對於64位的Win10系統太小太小.
顯卡是CPU自帶共用1GB記憶體.因為本人第一部電腦就是主板自帶顯卡.所以對於自帶顯卡很反感.所以是一大敗筆.
自帶多合1讀卡器這個倒是很實用.因為SD卡很常用.
鍵盤自帶有小鍵盤,Caps Lock鍵自帶燈,而Num Lock鍵就沒有燈,這有點不方便.
1TB硬碟但沒有劃分出擴展分區,自帶光碟和說明書媽咪嫌重在美國當飛碟仍了.暈X3.開機速度超過30秒還算可以.開機速度與硬體驅動,自啟軟體和硬碟讀取速度有直接關係.我在Win98時代我見過秒開.
15寸16:9軟屏上下左右可視角度很差,而且色彩不是很好. 與『IBM-T60P』15寸硬屏無法對比.影片輸出是HDMI沒有VGA,因位本人顯示器是太陳舊沒有HDMI,所以無法連接顯示器.
其鼠標觸控屏初用有點不爽.左右鍵要下按才有反應.還是買個無線USB滑鼠.
此電腦乃中國製造,只是在地球轉了一圈.
USB高速集線器(分線器)選購

隨著越來越多外設設備使用USB接口,而筆記本電腦和臺式電腦只有兩個或四個USB接口.如過外設設被過多這肯定是不夠使用的.
需要多小個USB接口? 那要數數你有多小USB設備.
如過只玩遊戲上網滑鼠鍵盤兩個USB接口就足夠了,無需額外購買USB集線器.
如果要日常辦公U盤,印表機,掃描移,攝像頭.那就要六個USB接口.
如果給手機充電(需2A電流)和USB移盤硬碟(占兩個USB接口)還需接上外置電源.那需要不小於七個USB接口.
USB接口需要開關嗎?
有些USB集線器為每個USB接口有個開口,這個很不需要的,你把設備插入就是要使用,不使用就拔掉.根本無需開關.而且品質最好的開關都有一定壽命,令USB集線器更容易損耗,降低使用壽命.反而為每個USB接口內置LEB工作燈更具實用價值.可以知道每個設備的工作狀態.
USB接口品質
USB接口品質也有好壞之分. 品質好的USB接口的彈片彈性很好不容量氧化.品質差的USB接經常接觸不良.使用的過程中經常斷開連接.而且還會損壞外設設備.特別是移盤硬碟.
USB傳送速度
| USB版本 | 理論最大傳輸速率 |
| USB1.0 | 1.5Mbps(192KB/s) |
| USB1.1 | 12Mbps(1.5MB/s) |
| USB2.0 | 480Mbps(60MB/s) |
| USB3.0 | 5Gbps(500MB/s) |
| USB3.1 | 10Gbps(1280MB/s) |
從上表可以得知USB接口的版本越高,傳送速度越快,版本1就不應購買.如過不使用USB硬碟或傳送大量資料購買2.0接口也可以.否則應購買USB3.0或以上.

Google發佈新款“像素”Pixel智能手機
2016年10月4日加利福尼亞州三藩市,Google產品管理總監艾理斯,介紹名為“像素”(Pixel)的新款智能手機。這是繼Nexus這個親生仔之後又一力作.它將會代替Nexus推出智能手機和平板電腦。
螢幕方面Pixel採用5.0英寸1080p螢幕,而Pixel XL採用2K解析度5.5英寸顯示幕。配置方面兩款手機近乎相同,採用驍龍821處理器輔以4GB運行記憶體+32GB/128GB存儲空間,搭載Android 7.1系統,支援DayDream VR平臺。32GB存儲的售價為649美元(約合人民幣4327元),而128GB的版本則為749美元(約合人民幣4995元),價格高的嚇死人,有“很黑”“真藍”“非常銀”三種顏色。將於今日在美國、澳大利亞、加拿大等地開始預約,13日在印度上線。中國大陸就別想了,雖由HTC代工生產. 但軟硬體則完全由Google自己設計。
1230萬圖元高品質的後置相機, 國外權威相機測試機構DxOMark給了它高於iPhone 7分數.
該機還擁有快充功能,充電15分鐘,就能用7小時。
谷歌首席執行官皮采表示,這款“谷歌助理”軟體使用了人工智慧技術,能夠“為每一位用戶提供個人化的Google服務”。 谷歌助手可以不斷學習,通過你的使用習慣和行為獲知你的喜好、需要和方位。主動為你提供合理化建議,而不是像往常一樣等待你的命令。

風雨中的微軟
由蓋茨與艾倫創辦於1975年創辦微軟.他們的開發的BASIC解譯器成為行業的標準,這令微軟逐漸佔領了整個市場.
1980年微軟迎來左一次歷史的選擇,IBM選中微軟為其個人電腦(PC)編寫作業系統.
蓋茨沒有選擇自已開發,而是選擇買.
以5萬美元的價格從西雅圖的一位元程式編制者派特森手中購買,這就是後來的MS-DOS.
IBM-PC的成功使MS-DOS成為作業系統的標準.其他PC製造商都採用MS-DOS與IBM相容.微軟以每個拷貝授權使用給其他公司.
1985年發行Windows1.0,第一個圖形介面作業系統.
1987年發行Windows2.0.
1990年發行Windows3.0,為以後Windows的成功墊下基礎.
1991年由於利益的衝突,IBM與微軟解除合作關係,這講明最好的硬體都是過眼雲煙,軟體和演算法往往最後保留下來.
1993年推出Component Object Model(COM——元件物件模型),COM一種元件軟體發展技術.
COM本身並不是錯誤,錯誤的是將所有元件基於COM來開發.如ActiveX, DirectX以及OLE等.
DirectX在6.0之後在全部基於COM開發. 要講清楚COM原理要很厚書籍,但是它所提功的函數工能可能很簡單.這是種過度封裝體現.過度封裝帶來的後果很嚴重,特別是個人/團體開發.當你發現問題時往往太遲,代碼庫以經太龐大,無法修正.即使是微軟毒性也一樣.這是微軟自已飲下的慢性毒藥.
1995年微軟發佈Windows95,一個基於16位DOS的32點陣圖型系統.ORS2自帶有IE,它的成功令個人電腦成為集遊戲機,工作,上網於一體.令計算進入彩色時代.
1995年微軟推出MSN,一個曾經與QQ進行激戰產品,在大一統全球佈局的思想下失敗,2013年關閉MSN.
1998年發佈Windows98,它在Windows95基礎上改良而來.支援更多硬體,更穩定.如果你不斷安裝軟體.重裝依然是你的唯一選擇.
2000年發佈Windows Me,最後一個16位/32位元混合的Windows系統.
1993年發佈Windows NT 3.1,微軟的開發工作始於1988年,它招攬UNIX系統的開發者,開發一款純32位元的伺服器作業系統,花費5億美金.自Window ME之後微軟所有系統度基於NT架構.
NT價構具有里程碑意義.之後Window 32位元系統就是以它為基礎的.
1996年發佈Windows NT 4.0 同樣是服務版,不適合個人使用.
2000年發佈Windows 2000,原名為Windows NT 5.0 同樣是服務版,不適合個人使用. XP基於Windows 2000代碼的產品
2001年發佈Windows XP,最多使用者的作品.介面視覺極佳.啟動速度非常快(啟動速度與安裝的硬體和驅動有直接的關係),穩定性比以往的Window讀要好.硬體的相容極佳.
很多舊硬體直接裝上驅動,硬體廠商紛紛開法XP的驅動.舊版Window使用者全部改用XP.是微軟歷史上最成功的系統之一.
2003年發佈Windows Server 2003,同樣是服務版,不適合個人使用.
2006年發佈Windows Vista,這是Windows間隔時間最久的一次發佈,相隔五年
它是微軟的最失敗的作品,系統要求高,運行速度慢.要裝Vista肯定要升升級你的舊硬體.
XP配搭Office 2003已滿足日常辦公需求.用戶完全無動力升級.
2008年發佈Windows Server 2008,同樣是服務版,不適合個人使用.
2009年發佈Windows 7,它的出現令大量XP用戶升級.它的圖型介面比XP更佳.
2012年發佈Windows 8,它統一PC與平板,移動設備後.
加入應用市場,讓個人用戶,團隊,企業有一應用的發佈管道.這是微軟應該在Windows95/Windows98年代就應該做的事.
它卻等到其他移動應用市場掘起,Windows移失去移動市場.
2012年發佈Windows Server 20012,同樣是服務版,不適合個人使用.
2013年微軟宣佈收購諾基亞.這是微軟繼COM元件物件模型,應用市場後又一重大失策.
不但消耗大量資金去購買一間不思改進的硬體廠家.還令其他硬體廠商失去開發Windows移動設備的興趣.
2015年發佈Windows10,它將是所有設備統一平臺,最後一個Windows.
面對Android/安桌系統在移動市場的絕對地位,微軟卻遲遲不開發安桌java虛擬機.
這招可講是微軟的閃電鉗型戰術.
小鉗型支援安桌軟體遊戲,吸收大量安桌用戶,手機開發廠商.
大鉗型支部安桌應用市場,加入移動廣告.更加威脅到Google廣告業務.
顏色代碼
這是一款生成自定義顏色的應用程式.
展示色樣,色板的實用工具!
全中文顏色名稱
專業的顏色選擇器
用戶自定義顏色(RGB/CMYK)
按音量鍵切換畫面
分享自定義的顏色代碼
支援多種顏色模型/顏色空間轉換
你必須登入才能發表留言。