我决定尝试在Python中使用Pygame进行实验,这样我就可以通过pixelarray绘制到屏幕上了。我决定按照this article来深入研究3D的数学

简而言之,我已经实现了所有功能。我构建了矩阵和向量数学运算并遇到了一些问题,但经过大量(EXTENSIVE)测试后,操作现在完全可以工作(点,十字,正常,标量,平移,旋转等)。我花了很多时间在微软的网站上阅读文档,了解这些功能的工作原理。因此,这些是我的解释:

@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)

其他所有内容与文章完全相同。但是,当我插入相同的点时,我会看到屏幕,只能在屏幕上对角线看到一个随机点。在使用一些打印语句以数学方式观察过程之后,看起来从所有这些中产生的最终3d矢量中提取的x和y包含一些明显被剪裁的INSANELY大数字(根据文章中提到的剪切操作)和没有画在屏幕上。

我唯一的猜测是旋转已关闭,因为微软的网站声明他们首先执行Z旋转,然后是x,然后执行y。然而,这与我到目前为止所阅读的所有内容完全相矛盾(除非左手坐标系旋转遵循不同的排序规则)。此外,即使尝试这种或任何其他组合,我没有一个结果。我知道绘图代码有效,但我知道矩阵和矢量代码是可行的,但我猜它是数学?

另一个比显示更好解释的潜在问题代码可能是我在某种程度上实现的Vector3.TransformCoordinate函数。我猜这个函数只是从x,y,z坐标创建一个4x1矩阵,并将w设置为1,然后将此列矩阵乘以4x4变换矩阵。最后,得到的列矩阵的x和y分量将是像素的假定x和y位置。但是,如果这不正确,我可能不明白该功能究竟做了什么。

正如我所说,一切都与文章完全相同(如果它是用Python而不是C#编写的)。我发布的代码在数学方面似乎是错误的。无论是那个还是我都失去了理智。最近几天我一直在重复这个问题。从字面上看,任何帮助都将受到赞赏。

编辑:这是函数Project的Python版本:

def Project(self, vectorCoord, transMatrix):

#Add a w field to the vector and set it to 1.0

if len(vectorCoord) != 4:

vectorCoord.values.append(1.0)

#Multiply the transformation matrix by the 4x1 column matrix

threePoint = transMatrix * Vector.toColumnMatrix(vectorCoord)

#Extract the x as per the article's and martineau's instructions

x = ((threePoint[0][0]/threePoint[3][0])

* float(self.front_buffer.get_width())

+ float(self.front_buffer.get_width()) / 2.0)

#Extract the y as per the article's and martineau's instructions

y = (-(threePoint[1][0]/threePoint[3][0])

* float(self.front_buffer.get_height())

+ float(self.front_buffer.get_height()) / 2.0)

#Delete this so the 3D vectors will not forever have a w appended to them

del vectorCoord

return Vector([x, y])

编辑:这是Render()函数:

def Render(self, camera, meshes):

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 渲染3d模型_Python中的3D软件渲染相关推荐

  1. python多元非线性回归模型_Python中多维数据样本的非线性回归

    试试像这样的 编辑:添加了一个使用线性回归结果估计输出的示例函数.import numpy as np data =np.array( [[-0.042780748663101636, -0.0040 ...

  2. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  3. threejs精灵模型_THREEJS中的3D(动画)模型

    关于web模型,这是个很难讲的主题,因为它跨了比较多的领域,之前也在文章中吐槽过: 然而,当时并没有很好的去解释3d模型的原理,原因主要是模型经手的并不多,并没有形成很好的方法论,只能大致说一下当时项 ...

  4. python连接sap接口_python中调用api接口

    CDN之API以及SDK的调用 简介 阿里云CDN提供了丰富的API接口,除了控制台,CDN还开发了多样化的接口.目前我们推荐用户使用新版API,详情请参见新版API参考.同时CDN提供了多语言SDK ...

  5. sketchup 图片转模型_su模型转换3d模型(如何将3D模型转化为sketchup)

    求救求救~~~3dmax模型 导入su 模型的位置变了 非得... 第一步  全部放到一个图层然后打组 第二部   随便画个box体 第三部  选择建筑点击链接变换 第四步   点击拾取 选择box体 ...

  6. python决策树 多分类_Python中的决策树分类:您需要了解的一切

    python决策树 多分类 什么是决策树? (What is Decision Tree?) A decision tree is a decision support tool that uses ...

  7. android 3d模型画点6,3D模型绘图工具最新版

    3D模型绘图工具app是一款非常不错的3D立体模型线上制作查看服务软件,就像电脑版本的cad差不多类型,直接使用该软件可以查看和编辑绘制模型图,支持连接设备打印功能,移动模型,缩放旋转都可以.需要的可 ...

  8. python里的非_python中逻辑非

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python逻辑运算的简介以及使用~ 逻辑运算在程序开发中,通常 在判断条件时, ...

  9. python基础知识测试题_Python中的单元测试—基础知识

    python基础知识测试题 Unit testing is the number one skill which separates people who just finished their de ...

最新文章

  1. 域渗透提权之MS14-068
  2. 一周飞越50万平方米,无人机检测1.5吨海滩垃圾!自动分类47种,准确率超95%
  3. 餐巾计划问题 线性规划与网络流24题之10 费用流
  4. 第十五届全国大学生智能汽车竞赛人工智能创意赛(预赛)
  5. 文件上传到ftp服务工具类
  6. 2018蓝桥杯省赛java_蓝桥杯2018年A组省赛
  7. Java线程的不同状态
  8. opencv学习笔记3
  9. 编程语言对比 迭代器
  10. 宁可多花1000元租房,也绝不要去挤半小时地铁
  11. 计算机多媒体软件应用,计算机应用基础【多媒体软件应用】课件.ppt
  12. html怎么隐藏音频的图标,XP系统realtek高清晰音频管理器图标如何隐藏
  13. 推广软件开发分析规范
  14. (个体户)注册公众平台步骤
  15. android手机的照片恢复软件,安卓手机照片恢复软件
  16. VScode+Unity3D的配置
  17. 腾讯视频解析,Java实现
  18. LeetCode 33. 搜索旋转排序数组
  19. 电子计算机机房设备接地线,电子计算机机房的防雷接地措施
  20. Linux发行版新秀:基于Ubuntu、系统核心 “不可变”

热门文章

  1. 程序员soul 012期|妹子|重庆
  2. Explain语法(精)
  3. html/css横向竖向导航栏的绘制
  4. PyCharm添加Anaconda中的虚拟环境,Python解释器出现Conda executable is not found(解决方案)
  5. python关键词排名_全自动监控网站关键词排名(Python实现)
  6. html换行不出现横线,wps为什么在换行空格下划线不显示
  7. 第 3-2 课:SpringBoot如何优雅地使⽤ MyBatis XML 配置版
  8. 使用Ballerina构建API网关
  9. 程序员从来没给丈母娘买礼物,真相竟然令人沉默
  10. vue 父传子props