3D打印之平房

3D打印之平房
3D打印之平房
3D打印之平房

美德薩斯州 ICON公司利用大型 3D 打印機和水泥漿為源料興建房屋.從圖片梯到3D打印的只是牆體部分.水平平臺並非打印,而木制屋頂更是預製件.水泥噴嘴孔徑從圖片可以梯出應不小50mm.牆體的光潔度你就不要追求啦,牆身在3米以下應該可以保持垂直.牆體如果在加高肯定會有問題(Y軸平行).所以我講是平房.牆身並非實心(填充密度).這個問題不大只要牆身夠厚,剛性有一定保證.但牆體內無鋼筋唔知是否能抵禦颱風和地震.半日內建成能完成牆體打印.只要台大型 3D 打印機能快速部署.技術純熟加上廉價肯定會有市場.

FPS

FPS

FPS全稱為Frames Per Second.用於統計遊戲與影片每秒的渲染畫面(幀)次數.此值越高畫面越流暢,電影以每秒24格菲林進行播放.所以你的遊戲要流暢無停頓感.需要不低於24幀最好高於30幀.當然幀數越高越好.

FPS算法如下:

FPS = 100 * Frequency / (currentTime – startTime);

Frequency為時鐘頻率. currentTime與 startTime為前後兩次時鐘

 

Windows下你需要高精度計數器:

返回硬件級高精度時鐘頻率,若返回0代表系統不支持.

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

返回硬件級高精度計數器,若返回0代表系統不支持.

BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

LARGE_INTEGER:為64BIT結構

 

此兩個函式需要winbase.h頭文檔和Kernel32.LIB庫

#include <winbase.h>

#pragma comment(lib, “Kernel32.LIB”)

 

定義如下FPS結構:

typedef struct FPS_TYP {

LARGE_INTEGER  Frequency;// 計數器的頻率

LARGE_INTEGER  startTime;// 啟動時鐘

float Frames;// 每秒渲染幀數

int n;// 臨時幀計數器

}FPS,*FPS_PTR;

 

初此化高精度定時器

bool Init_FPS(FPS_PTR fps)

{

// 返回硬件支持的高精度計數器的頻率

if (QueryPerformanceFrequency(&fps->Frequency) == false)

return false;

// 獲取啟動時鐘

QueryPerformanceCounter(&fps->startTime);//

return true;

}

 

計算每秒渲染幀數,每100幀進行一次計算

float Get_FPS(FPS_PTR fps)

{

++fps->n;

if (fps->n > 100)

{

LARGE_INTEGER currentTime;

// 返回高精度計數器

QueryPerformanceCounter(&currentTime);

fps->Frames = (float)100 * (float)fps->Frequency.QuadPart / ((float)currentTime.QuadPart – (float)fps->startTime.QuadPart);

fps->startTime = currentTime;// 重置時間

fps->n = 0;

}

return fps->Frames;

}

 

计算两次测量所花费时间

float Get_Counter_FPS(FPS_PTR fps){

LARGE_INTEGER currentTime;//当前时钟

// 返回高精度计数器

QueryPerformanceCounter(&currentTime);

float seconds = ((float)currentTime.QuadPart – (float)fps->startTime.QuadPart) / (float)fps->Frequency.QuadPart;

fps->startTime = currentTime;

return seconds;

}

 

OpenGL頂點數組

OpenGL頂點數組

遊戲的實際的開發中將會大量頻繁地處理頂點,在簡單多邊形可以使用代碼直接生成模型頂點.而真正的遊戲隨便一個模型就可能有幾百或幾千個多邊形.不可能使用代碼直接生成.解決的方法是使用『頂點數組』(Vertex Array).通過建模軟件進形3D建模,然後輸出特定的文本文檔或二進制文檔.可分為以下幾個部驟.

  1. 從磁盤上的模型文檔中載入模型的頂點數據.
  2. 將頂點數據儲存在數組(array),如將頂點座標存入獨立數組,法線數組,顏色數組.
  3. 當OpenGL需要頂點數據時,載入相應的數據.

 

啟用『頂點數組』

void glEnableClientState(GLenum array);

禁用『頂點數組』

void glDisableClientState(GLenum array);

參數 簡介
GL_COLOR_ARRAY 啟用頂點顏色數組
GL_EDGE_FLAG_ARRAY 啟用頂點的邊EdgeFlag數組
GL_INDEX_ARRAY 啟用頂點的調色板索引數組
GL_NORMAL_ARRAY 啟用法線數組
GL_TEXTURE_COORD_ARRAY 啟用紋理座標數組
GL_VERTEX_ARRAY 啟用定點座標數組

 

載入頂點的顏色數組:

void glVertexPointer(GLint size,GLenum type,GLsizei stride,const GLvoid  *pointer);

參數 簡介
size 頂點顏色分量其值只能為3(rgb)或4(rgba)
type 數組的數據類型

GL_BYTE

GL_UNSIGNED_BYTE

GL_SHORT

GL_UNSIGNED_SHORT

GL_INT

GL_UNSIGNED_INT

GL_FLOAT

GL_DOUBLE

stride 跨度,兩個顏色之間的字節數,如果顏色數據是緊湊則填為0
pointer 頂點的顏色數組

 

載入邊(Edge)數組:

void glEdgeFlagPointer(GLsizei stride,const GLvoid *pointer);

參數 簡介
stride 跨度
pointer 多邊形邊(Edge)數組bool類型數值

 

載入調色板顏色索引數組

void glIndexPointer(GLenum type,GLsizei stride,const GLvoid *pointer);

參數 簡介
type 數組的數據類型

GL_SHORT

GL_INT

GL_FLOAT

GL_DOUBLE

stride 跨度相鄰索引之間的字節數
pointer 調色板顏色索引數組

 

載入頂點的法線向量,每三個元素組成一個法線向量

void glNormalPointer(GLenum type,GLsizei stride,const GLvoid *pointer);

參數 簡介
type 數組的數據類型

GL_BYTE

GL_SHORT

GL_INT

GL_FLOAT

GL_DOUBLE

stride 跨度相鄰法線之間的字節數
pointer 頂點的法線向量數組

載入頂點的紋理座標數組void glTexCoordPointer(Glint size,GLenum type,GLsizei stride,const GLvoid  *pointer);

參數 簡介
size 頂點的座標數,其值只能為1,2,3,4

1為1維紋理(s)

2為2維紋理(s,t)

3與4較小使用

type 數組的數據類型

GL_SHORT

GL_INT

GL_FLOAT

GL_DOUBLE

stride 跨度,兩個紋理之間的字節數
pointer 頂點紋理座標數組

 

載入頂點座標數組:

void glVertexPointer(Glint size,GLenum type,GLsizei stride,const GLvoid *pointer);

參數 簡介
size 頂點的座標分量:2,3,4
type 數組的數據類型

GL_SHORT

GL_INT

GL_FLOAT

GL_DOUBLE

stride 跨度,兩個頂點座標之間的字節數,如果是緊湊方置其值為0
pointer 頂點座標數組

繪畫所有當前以啟用的頂點數組void glDrawArrays(GLenum mode,GLint first,GLsizei count);

參數 簡介
mode GL_POINTS:點

GL_LINE_STRIP:相連的直線

GL_LINE_LOOP:閉合的相連直線

GL_LINES:非相連的直線

GL_TRIANGLE_STRIP:相連的三角形 GL_TRIANGLE_FAN:共用頂點三角形

GL_TRIANGLES:度立的三角形

GL_QUAD_STRIP:相連的四邊形

GL_QUADS:四邊形

GL_POLYGON:任意頂點多邊形

first 數組起此索引
count 繪畫的頂點量

 

以任意順序繪畫以啟用的頂點數組void glDrawElements(GLenum mode,GLsizei count,GLenum type,const GLvoid *indices);

參數 簡介
mode 與glDrawArrays()的一致
count 索引數組的長度
type 索引的數據類型,只能是無符號整數GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT GL_UNSIGNED_INT
indices: 索引數組

按值定的範圍繪畫以啟用的頂點數組

void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);

參數 簡介
mode 與glDrawArrays()的一致
start 索引數組開此索引
end 索引數組結束索引
count 索引數組的長度
type 索引的數據類型,只能是無符號整數與glDrawElements()的一致
indices: 索引數組

按數組索引繪畫單一個頂點void glArrayElement(GLint index);

參數 簡介
index 頂點的索引

演示程式中繪畫幾百個球體不斷移動,若不使用頂點數組每秒只有約66幀,而若使用頂點數組性能大幅度提升到每秒有200幀.性能有驚人的提升(不同的計算機性能有所差別).按空格鍵啟用或禁用頂點數組.演示程式下載:

 

OpenGL顯示列表

OpenGL顯示列表

OpenGL支持稱為『顯示列表』(Display List)性能優化,它相當於把OpenGL代碼進行預編譯,並載入顯卡記憶體,從而降低系統開銷,但它對於程式的性能改善並不總是特別明顯,而且不同的圖形卡廠商的實現也有方式各異,最終效果視情況而定,不過最差的情況下也要比不使用好.

 

生成顯示列表, 返回列表索引

GLuint glGenLists(GLsizei range);

range:顯示列表數量

 

判斷顯示列表是否有效,有效則返回GL_TRUE

GLboolean glIsList (GLuint list);

list:列表索引

 

向顯示列表填充命令,把代碼寫在glNewList()與glEndList()

void glNewList(GLuint list,GLenum mode);

list:列表索引

mode:編譯模式分別有GL_COMPILE(編譯)和GL_COMPILE_AND_EXECUTE(編譯並執行)

 

結束填充數據

void glEndList(void);

 

當你擁有顯示列表,可以在任何地方調用顯示列表

void glCallList(GLuint list);

 

如果要一次調用多個顯示列表,依次調用.

void glCallLists(GLsizei num,GLenum type,const GLvoid *lists);

num:顯示列表個數

type:索引的類型

lists:顯示列表索引數組

 

如果想其它索引值開次執行,從offset開此到num-1結束

void glListName(GLuint offset);

offset:索引數組的偏移

 

顯示列表的燒毀,當創建顯示列表需要為其分配記憶體存儲OpenGL代碼,當程式結束時要將記憶體釋放,防止記憶體洩漏

void glDeleteLists(GLuint list,GLsizei range);

list:列表索引

range:顯示列表數量

 

執行顯示列表演示代碼:

if(glIsList(list->ID) == GL_TRUE)

{

glCallList(list->ID);// 調用顯示列表

}

else

{

list->ID = glGenLists(1);// 生成顯示列表

glNewList(list->ID, GL_COMPILE_AND_EXECUTE);

// 填入執行代碼

glEndList();

}

 

演示程式中繪畫幾百個球體不斷移動,若不使用顯示列表每秒大約200幀,而若使用顯示列表性能大幅度提升,每秒去到670幀.真是出乎意料.按空格鍵啟用或禁用顯示列表.下載演示程式:

互聯網之 Cloudflare推出免費DNS(1.1.1.1)

互聯網之 Cloudflare推出免費DNS(1.1.1.1)

互聯網公司Cloudflare推出免費的DNS服務,與APNIC進行合作使用它的IP位址(1.1.1.1), Cloudflare保證你使用它的DNS服務會絕對保證你的隱私,絕不會出售您的數據,或用來定位廣告,更不會記錄您的 IP 位址.

而且Cloudflare聲稱它的DNS服務比其它公司的DNS服務速度更快,比起GOOGLE的快最小兩倍.

DNS 響應速度
1.1.1.1 14.8ms
Cisco OpenDNS 20.6ms
Google Public DNS 34.7ms
Average ISP 68.23ms

在Windows10設定DNS伺服器IP位址

  1. Win+E打開『檔案總管』
  2. 點選打開『控制台\網路和網際網路\網路和共用中心』
  3. 點選『乙太網絡』
  4. 點選『內容』
  5. 雙擊打開『網際網路通信協定第4版(TCP/IPV4)』 勾選『使用下列的DNS伺服器位址』
  6. IPV4『慣用DNS伺服器』填1.1.1
  7. IPV4『其它DNS伺服器』填0.0.1
  8. 雙擊打開『網際網路通信協定第6版(TCP/IPV6)』勾選『使用下列的DNS伺服器位址』
  9. IPV6『慣用DNS伺服器』填 2606:4700:4700::1111
  10. IPV6『其它DNS伺服器』填 2606:4700:4700::1001
  11. 重啟瀏覽器

OpenGL之圖像合成器

OpenGL之圖像合成器

對圖像(紋理)合成你可以得到圖像變換的動畫效果,如『燈火』.通過讀取兩張圖像,然後對其進行插值運算,最後生成平滑過渡的效果.演示程式下載:

對兩個或者多個紋理進行組合:

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE);

紋理平滑過渡

GLfloat texEnvColor[] = {0.0f,0.0f,0.0f,combiner->interpol };

glActiveTexture(GL_TEXTURE1);

glTexEnvfv(GL_TEXTURE_ENV,GL_TEXTURE_ENV_COLOR, texEnvColor);

載入紋理單元0

Load_File_Texture(&combiner->texture0, hInstance, filename0);

激活紋理單元0

glActiveTexture(GL_TEXTURE0);

綁定紋理0

Bind_Image_Texture(&combiner->texture0);

glEnable(GL_TEXTURE_2D);

將紋理傳遞到下一個單元

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

載入紋理1

Load_File_Texture(&combiner->texture1, hInstance, filename1);

激活紋理單元1

glActiveTexture(GL_TEXTURE1);

綁定紋理1

Bind_Image_Texture(&combiner->texture1);

glEnable(GL_TEXTURE_2D);

設置紋理組合模式

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE);

使用插值組合函式

glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);

設置成紋理單元0的輸出

glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);

設置成當前紋理圖像

glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);

為紋理單元設置ARG2

glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);

使用alpha常數修改RGB分量

glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);

Windows10之功能更新版本1709錯誤碼0xc1900205

Windows10之功能更新版本1709錯誤碼0xc1900205

近日Windows10更新版本1709時總會彈出錯誤碼0xc1900205,使用『Windows Update』與『Windows10更新小幫手』均出錯並彈出下面的信息:

Microsoft 無法在您的電腦上安裝重要的安全性更新。

請連絡 Microsoft 支援服務以獲得解決此錯誤的協助。

請將此錯誤碼提供給支援人員: 0xc1900205

通過如下方法即可修復:

  1. 新增『文字文件.txt』輸入下面命令,並保存為『cmd』.(此方法適合大量類似問題)
  2. 以系統管理員身份執行CMD
net stop wuauserv

Dism.exe /online /Cleanup-Image /StartComponentCleanup

Dism.exe /online /Cleanup-Image /RestoreHealth

net start wuauserv

3.我已生成cmd文檔可以直接下載:

 

Windows10之以系統管理員身份執行命令視窗CMD

Windows10之以系統管理員身份執行命令視窗CMD

在Windows10下很多命令需要『系統管理員』Administrator的『權限』才能執行,有4中方法打開

  1. 快捷鍵『WIN+X+A』打開命令視窗(系統管理員:命令提示字元),此方法成功較低不建議使用
  2. 快捷鍵『WIN+E』打開『檔案總管』,按住『shift』鍵以鼠標右鍵點擊任意『檔案資料夾』彈出菜單『在此處開啟命令視窗』此方法無系統管理員權限
  3. 快捷鍵『WIN+E』打開『檔案總管』定位『C:\Windows\System32\cmd.exe』以鼠標右鍵點擊彈出菜單『以系統管理員身份執行』打開命令視窗
  4. 新增『文字文件』寫入你要執行的命令並保存,將『副檔名』改為『cmd』.以鼠標右鍵點擊彈出菜單『以系統管理員身份執行』打開命令視窗,此方法最為方便

 

Android桌面已鎖定

Android桌面已鎖定

近日台Android電話在刪除或移動APP時,彈出『桌面已鎖定』大驚難道中毒?細想之下應該是桌面被鎖定,通過下面設定即可修復

  1. 打開『設定』
  2. 打開『系統和設備/桌面與近期任務』
  3. 禁用『桌面佈局/鎖定桌面佈局』

OpenGL之環境映射

OpenGL之環境映射

環境映射即在表面『映射』其它物體,如湖面上『映射』出『樹、雲、天、人』,而OpenGL並不是真正地對環境進行反射獲得的效果.演示函式下載:

  1. 創建物體表面的紋理圖
  2. 使用OpenGL自動生成相應的紋理座標,可以使用GL_SPHERE_MAP(球體映射)和GL_REFLECTION_MAP(反射光映射)
  3. 移動鏡頭到物體並指向視點
  4. 隨著物體的移動而生成新的紋理座標,使得環境反射效果隨著物體移動而變化,使用glCopyTexImage2D()和glCopyTexSubImage2D()從屏幕上拷貝並生成紋理
  5. 如果要填充多邊形顏色,你要禁用紋理glDisable(GL_TEXTURE_2D);才能正確渲染.

 

紋理座標生成函式:

void glTexGenf(GLenum coord,GLenum pname, GLenum param)

glTexGenf()函式coord: 簡介
GL_S s紋理坐標
GL_T t紋理坐標
GL_R r紋理坐標
GL_Q q紋理坐標

 

glTexGenf()函式pname: param簡介
GL_TEXTURE_GEN_MODE GL_SPHERE_MAP

GL_REFLECTION_MAP

GL_OBJECT_LINEAR

GL_EYE_LINEAR

GL_NORMAL_MAP

GL_OBJECT_PLANE Param指向生成紋理坐標所需的4個元素,配合GL_OBJECT_LINEAR使用
GL_EYE_PLANE Param指向生成紋理坐標所需的4個元素,配合GL_EYE_LINEAR使用

 

生成環境映射紋理代碼

glGenTextures(1, &texture.ID);

glBindTexture(GL_TEXTURE_CUBE_MAP, texture.ID);

設定紋理參數代碼

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

將紋理坐標生成模式設置為環境映射(反射光)函式

glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);

glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);

glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);

 

移動鏡頭到物體並指向視點,設置屏幕以匹配環境映射的大小

glViewport(0, 0, 256,256);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

設置90度視口

gluPerspective(90, 1, 0.1, 500);

glMatrixMode(GL_MODELVIEW);

glClear(GL_DEPTH_BUFFER_BIT);

載入單位矩陣

glLoadIdentity();

設定相機

gluLookAt(0.0, 0.0, 0.0,posx,posy,posz,neggx,negy,negz);

通過glCopyTexImage2D()和glCopyTexSubImage2D()從屏幕上拷貝並生成環鏡映射紋理

從緩衝區中拷貝像素創建紋理函式

typedef void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);

從緩衝區中拷貝部分像素創建紋理函式

typedef void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);

 

渲染環鏡映射代碼

glEnable(GL_TEXTURE_GEN_S);

glEnable(GL_TEXTURE_GEN_T);

glEnable(GL_TEXTURE_GEN_R);

使用立方體映射

glEnable(GL_TEXTURE_CUBE_MAP);

glBindTexture(GL_TEXTURE_CUBE_MAP, texture.ID);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

gluSphere(quadric, 1.0, 64, 64);// 繪畫大球球體

glDisable(GL_TEXTURE_CUBE_MAP);

glDisable(GL_TEXTURE_GEN_S);

glDisable(GL_TEXTURE_GEN_T);

glDisable(GL_TEXTURE_GEN_R);