我決定嘗試在python中使用pygame進行乙個實驗,這樣我就可以通過pixelarray繪製到螢幕上。我決定按照this article來鑽研3d的數學
總之,我已經實現了每乙個功能。我建立了矩陣和向量的數**算,並有一些問題,但經過廣泛(廣泛的)測試,這些運算現在完全可以工作了(點、十字、法線、標量、平移、旋轉等)。我花了相當多的時間在微軟的**上閱讀這些函式如何工作的文件。因此,我的解釋如下:@staticmethod
def lookatlh(cameratarget, cameraposition, cameraupvector):
zaxis = vector.norm((cameratarget - cameraposition))
xaxis = vector.norm(vector.threecross(cameraupvector, zaxis))
yaxis = vector.threecross(zaxis, xaxis)
return matrix ([[xaxis[0], yaxis[0], zaxis[0], 0.0],
[xaxis[1], yaxis[1], zaxis[1], 0.0],
[xaxis[2], yaxis[2], zaxis[2], 0.0],
[-vector.dot(xaxis, cameraposition), -vector.dot(yaxis, cameraposition), -vector.dot(zaxis, cameraposition), 1.0]])
@staticmethod
def perspectivefovrh(fov, aspectratio, np, fp):
d = (np - fp)
h = (1.0 / (math.tan(fov / 2.0)))
w = (h / aspectratio)
try:
one = fp/d
except zerodivisionerror:
one = 0.0
try:
two = ((np*fp)/d)
except zerodivisionerror:
two = 0.0
return matrix ([[w, 0.0, 0.0, 0.0],
[0.0, h, 0.0, 0.0],
[0.0, 0.0, one, -1.0],
[0.0, 0.0, two, 0.0]])
@staticmethod
def rotationyawpitchroll(xrot, yrot, zrot):
zaxis = matrix([[math.cos(zrot), math.sin(zrot), 0.0, 0.0],
[-math.sin(zrot), math.cos(zrot), 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0]])
yaxis = matrix([[math.cos(yrot), 0.0, -math.sin(yrot), 0.0],
[0.0, 1.0, 0.0, 0.0],
[math.sin(yrot), 0.0, math.cos(yrot), 0.0],
[0.0, 0.0, 0.0, 1.0]])
xaxis = matrix([[1.0, 0.0, 0.0, 0.0],
[0.0, math.cos(xrot), math.sin(xrot), 0.0],
[0.0, -math.sin(xrot), math.cos(xrot), 0.0],
[0.0, 0.0, 0.0, 1.0]])
return ((xaxis * yaxis) * zaxis)
其他的都和文章完全一樣。然而,當我插入相同的點時,我觀察螢幕,只看到乙個隨機的點斜斜斜地斜放在螢幕上。在使用一些print語句以數學方式觀察過程之後,從最終生成的3d向量中提取的x和y似乎包含了一些非常大的數字,這些數字明顯被剪裁(根據文章中提到的裁剪操作)而不是在螢幕上繪製的。在
我唯一的猜測是,當微軟**宣告他們先執行z軸旋轉,然後x軸旋轉,然後y軸旋轉時,這是完全錯誤的(除非左手座標系的旋轉遵循不同的排序規則)。而且,即使是嘗試這個或任何其他組合,我也沒有得到任何結果。我知道繪圖**是可行的,我也知道矩陣和向量**是可行的,但我猜這是數學問題?在
另乙個潛在的問題**可能是我實現的vector3.transformcoordinate函式。我猜這個函式只是從x,y,z座標建立乙個4x1矩陣,將w設定為1,然後將列矩陣乘以4x4變換矩陣。最後,得到的列矩陣的x和y分量將是畫素的假定x和y位置。但是如果這個函式不正確的話,我可能不明白這個函式的真正作用。在
正如我所說,一切都和文章完全一樣(如果它是用python而不是c編寫的話)。我發布的**在數學上似乎是錯誤的。不是那樣,就是我瘋了。這幾天我真的一次又一次地回顧了這件事。從字面上說,任何幫助都將被感激。在
^$i = j = 0
meshlist = [meshes]
viewmatrix = matrix.lookatlh(camera.position, camera.target, vector([0.0, 1.0, 0.0]))
projectionmatrix = matrix.perspectivefovrh(0.78, float(self.front_buffer.get_width())/float(self.front_buffer.get_height()), 0.01, 1.0)
for mesh in meshlist:
worldmatrix = (matrix.rotationyawpitchroll(mesh.rotation[0],
mesh.rotation[1],
mesh.rotation[2])
* matrix.translate(mesh.position))
transformmatrix = worldmatrix * viewmatrix * projectionmatrix
for vector in mesh.vertices:
point = self.project(vector, transformmatrix)
self.drawpoint(point)
python渲染光線 Python光線追蹤
我正在用純python構建乙個簡單的python光線追蹤器 僅僅是為了它 但我遇到了障礙。我的場景的設定目前是這樣的 相機位於沿y軸指向的0,10,0。半徑為1的球體位於0,0,0。成像平面物距1遠離相機,其寬度和高度均為0.5。我通過成像平面以均勻隨機分布的方式拍攝光子,並且如果光子碰巧與物體相交...
python實驗三 Python實驗三
python 程式設計實驗報告 班級 物流191 姓名 張曼曼 學號 3190505121 成績 日期 2020.4.8 指導教師 修宇 實驗三 分支結構程式設計 設計性實驗 實驗目的 1 學會正確使用比較運算子與比較表示式 邏輯運算子和邏輯表示式 2 熟練用if語句設計選擇結構程式 實驗條件 pc...
Python三 python列表簡介
列表是由一系列按特定順序排列的元素組成,也可以將任意東西加入到列表中,因為列表中常常包含多個元素,故給列表乙個複數命名 在python中,用方括號 來表示列表,並且用逗號分隔每乙個其中的元素。第二個元素的下標才為1,以此類推 索引特別語法,通過索引下標為 1可知,可使python返回最後乙個元素的值...