论我要在HP39GS计算器上弄3D图像程序的动机:无聊

在一个无聊的下午,我在刷视频的时候偶然看见了有关讲述透视投影的原理。我看了看公式,又看了看我的计算器,我一个大胆的念头油然而生:我是不是可以在计算器上做一个3D引擎呢?

没错,我大胆的想法驱使着我研究这个东西,不过,我在网上搜了一堆有关透视投影的公式,我仍然没有看得明白(我不懂矩阵运算,现在也一样。。。)

不过我还是硬着头皮弄了下去。。。

歪门邪道的想法

hohoho,现在回想起来还真是有点 哈子噶系 ,说到底,要是论当时我为了做出一个三维变换到底弄了些什么幺蛾子,那就有点意思了。

起初,我受到了以前一个像素游戏 《德军总部3D》 的启发,然后想着能不能先做一个可以除开俯视和仰视功能的3d变换程序出来,然后。。。当时因为是在高中,我看着一个幂函数有点眼熟,然后就把这个公式当作中心点进行设计。

幂函数法:通过幂函数对应的x与y值来实现一个视野旋转的效果

当然,这么搞,不仅是内行人,连外行人可能也会说我脑子有点不灵通

对数函数法。。。。。算了,这个就不说了吧

。。。后来有那么一次,我不知道我是哪个值改对了,计算器在显示平面的时候异常得可以,不过很可惜,它也就只能上下前后移动,没有左右,很快就被我淘汰掉了;

PS:当时我知道3D变换确实是由相似三角形和向量知识结合而成,只怪我当时学艺不精,哎。

偶然的一次设计成功(也不能算成功吧):

当我在学到向量与角度的关系时,我又有了新的想法:用判断向量与向量之间的夹角的方式能不能做到透视变换的效果呢?

答案是:一开始是不可以的

原因很简单,我第一个想法就是用基于坐标轴上,在相机的左方,上方与前方分别放置一个向量,三个向量同时判断顶点在相机的方位,但是问题也很明显,性能损耗太大,算一个向量已经够hp39gs喝一壶的了,再加上39GS原有的hpbasic语言的编译仅仅只是编译到汇编语言中,那慢得。。。也是可想而知。后来我去除掉了上方和右方的向量,改为前方测定顶点与向量的夹角,高度差则由顶点高度减去相机高度,再乘以一个可变因数,然后,一个伪三维变换的程序出生了!

但是,角度计算。。。它计算的只有正角,没有负角。这也意味着,如果我把用于判断夹角的向量放在正前方,那么它所得到的结果就是,(当时用的画线,画线的x和y是基于FUNCTION的PLOT面板定义的)在y轴右边,呈现的是正确的图像,而在y轴左边,呈现的则是镜像,那我一定不能忍,然后就把PLOT的中心点从(0,0)改为了(6,3),也就是把y轴左边的内容遮挡住,那么呈现的内容就没有问题了。

我消不了你,我不看还不行吗。

后来,在某一次39gs断电清数据后,我的心态差点就炸开了,因为我还没备份。。。

过了一段自闭期后,我又重新会想起之前的透视变换程序,我想到了之前写的好像功能并不完善,于是我又重振旗鼓再一次开始了,两天过后,一个近代的透视投影程序出现了,它的名字叫3DViewPort(Viewport的取名源于虚幻4引擎的viewport函数)它相比于上一次的程序,它变得功能多了,那时,我也接触到了grob(hp39gs里面的一种graphic类型的已定义变量,从G0-G9总共有10帧)这个东西,说它好,是真的好,得益于它还不错的图像回放速度,我用它一并整合进3DViewPort内作为图像录制的工具,这也是衍生程序graphplayer(我写这个基本上是为了回放3DViewPort录制进grob的内容)的出现。

那一次,我有了前车之鉴,立马做了个备份。然后它就一直在我的备份里面和计算器里面躺着了。

3DViewPort

一个不合群的三维变换软件

总共分有3个功能:相机放置区,物体编辑区,3D视野构造面板

相机放置区:仅用于移动相机用的面板,同时也是动画录制的地方

物体编辑区:功能有创建物体,选择物体,物体位移,物体顶点编辑(这个最后还是没弄好),物体移除,复制和保存

问题:3D变换不精确;在x轴隐隐约约的有鱼眼的效果;y轴倒是不会;而且无法俯仰;物体编辑时,如果不小心按错其它键,那就要再等它加载一次物体数据;由于我在里面使用了距离公式的问题,当相机xz点与顶点xz重合时会报错Bad Argument Type,所以我一般在放置相机时尽量确保相机与物体顶点有一定的距离。。。

本人对这种妥协感到强烈的不满意,于是新的3d变换公式就要出现了

论重制后的“3DViewPort”-PLOT3D的来由

实际上,这个也不能说是3dviewport的更新版了,因为,它的3d引擎与它的一切功能都被重新设计了,3DViewPort完全不能和我最近写的PLOT3D沾的上什么边。

新的PLOT3D相比我之前写的3DViewPort有什么区别呢?

说实话,哪几天,有关向量的知识可能算是我想得最多的了吧,我已经不记得我这个学渣为了这个简单的公式画了多少个三角形,也不知道我到底弄了多少公式。。。

当时唯一不明白的问题就是。。。如何将世界坐标转换到相机相关的本地坐标

起初,我在用UNITY开发游戏的时候偶然遇见了向量Vector3里面的Vector3.Dot( Vector3,Vector3)与Cross,也就是点乘和叉乘(网上有一篇文章说的是这两者搭配可以达到判断物体在向量前后左右的效果),我也同时发现了,我在Unity进行游戏人物在不同方位的脚步的正常运动方向可以通过这两个函数来完成操作,我就试着用草稿本算了一下,等写到计算器后,数值与自己想的相差了很多,而且非常离谱,我突然又郁闷起来了。。。不过,过了一会,我发现:如果想要得到顶点在相机前方的本地坐标,只要让顶点坐标乘以相机前方的单位向量即可!

即设顶点p(x,y,z),相机单位向量C(x1,y1,z1)

这两个这么一乘 p*C=x*x1+y*y1+z*z1=结果

顶点相对于相机的本地坐标就出来了

这一发现最终成为了PLOT3D诞生的源头,我一开始写的PLOT3D测试版并不叫本名,而是叫“VectorTest”,也就是向量测试,整个三维变换是由向量组成的。故以此命名

后来过了那么两天,完整的透视变换最终出现在了我的笔记本上

其中,sita角与D角分别为旋转角与俯仰角

整个推导式的话,唯一不足就是fov没法正常求到,我只能用相关符号进行标记

与此同时,我也发现了,当把笔记中的zDepth改为1时,视角会变成正交投影视角。

有了这些

我最终用了一个星期把这个东西做出来了。

PLOT3D的功能

知乎视频​www.zhihu.com

这次的PLOT3D由之前的三面板变成了双面板(三维变换面板)(物体与相机的操作面板)

而且,物体的编辑相比3DViewPort要更加有效率的多

举个例子:PLOT3D是矩阵型顶点编辑,之间把顶点列出来以供修改,而3DViewPort是指定一个顶点,编辑一个顶点,两者耗费的时间可想而知。

由于hp39gs在程序上的硬性限制,我没法将全部的功能都写在一个程序中。。。

于是,分模块出现了

程序包含4个模块:

1.PLOT3D(主程序)

2.grobwritter(9帧动画录制模块,会在3d模式且开启了录制的情况下运行)

3.slotfun(一个可扩展的后处理程序,会在3d模式的透视视角下运行)

4.graphplayer(当录制完后可以使用它播放动画,注意,它会使用你的计算器里面G1到G9的grob图像数据,与grobwritter一样)

(PS:顺带一提,贴心的我为了防止使用者随便打开里面的任意一个程序造成一些不痛不痒的问题,我顺便加了主程序未打开,模块不能被打开的温馨提示)

目前,这个slotfun程序还未完成,我会在此之后完善,当然,你也可以自己写。。。

相机的变换(透视投影与正交投影)

PS:整个坐标轴的定义是按照Unity的y轴为上,x轴为右,z轴为前进行定义

标题的配图中的场景是我专门为了测试它的3d变换的可行性而手动构造的,旨在让观者看出透视投影与正交投影的区别

这是透视投影视角下的场景

Perspective

这是正交投影下的场景

ISO

两者的视角均没有发生变化


后话

总之,程序,终究是有待开发的东西,以后我希望还能再加入一些更加好的功能。。。当然,如果你手上刚好有一台Hp39gs,也对我所设计的程序感到兴趣的话,欢迎你下载我的程序

(目前的bug与不足:

1.在特定情况下,可能会发生bad argument问题,但极少,可以忽略

2.3d视角下,在物体跨越相机后可能会出现显示异常的问题,这是我的算法问题,但是没办法,我没法在有限的性能内再加入一个性能耗费颇高的物体渲染功能

3.由于39gs的尿性,每秒只能运算1-2个顶点。)

文档

PLOT3D 提取码:mgfn​pan.baidu.com

计算器算贝塞尔公式_【3D与图形计算器的相遇】论一个3d画图软件的在计算器上的诞生...相关推荐

  1. 计算器算贝塞尔公式_浅谈计算器的普及与中学数学教科书的关系

    [作者声明] 本文所有文字均为作者原创,所有图片均为作者本人亲自截图或制作. 版权所有,仅供阅读欣赏,未经作者允许,禁止任何单位或个人以任何形式对本文的文字或图片进行包括但不限于复制.转载.引用.抄袭 ...

  2. 计算器算贝塞尔公式_一个强大的高等数学计算器

    学过高等数学的你... 是否苦于复杂的积分不会算?级数不会算?极限不会求? 说到数学软件,你只能想到Matlab?或者Mathematica? 当然,会这些软件你也很牛了! 可是...大多数人记不清相 ...

  3. 计算器算贝塞尔公式_绝版应用!超级好用的计算器!

    现在大家的手机都会自带计算器软件,但是功能却非常简单,基本都停留在四则运算上.稍微高级一点的科学计算器,可能会带有初等函数的计算.顶多就满足一下中小学生的需求,而对于高中大学生的作用微乎其微 今天就给 ...

  4. 计算器算贝塞尔公式_买车贷款怎么算利息?

    买车贷款利息是多少? 目前贷款买车有三种方式,一是直接通过银行进行购车贷款,二是汽车金融公司购车贷款,三是信用卡分期购车. (1)信用卡分期购车的利息 除审批和手续相对简单的优势外,信用卡购车无须提供 ...

  5. 计算器算贝塞尔公式_【机动战姬:聚变】伤害计算公式

    文丨当年滄海@bigfun社区 原文地址:伤害计算公式,推起来挺简单,那有什么应用呢? - bigfun 一.简单聊一下常见的伤害公式 主流的伤害公式就两种,减法公式和除法公式(乘法) 减法公式:at ...

  6. 计算器算贝塞尔公式_「机动战姬:聚变」伤害计算公式

    文丨当年滄海@bigfun社区 一.简单聊一下常见的伤害公式 主流的伤害公式就两种,减法公式和除法公式(乘法) 减法公式:atk-def=dam 除法公式:atk*(1-f(def))=dam,f(d ...

  7. 计算器算贝塞尔公式_空气源热泵采暖重点计算公式汇总

    1.能效比(制热.制冷系数) ε= Q / W 即:得热(冷)量与输入功率之比 2.空气源热泵实际工况下的制热量 Q=q×K1×K2 Q-实际工况下的制热量,kW; q-产品标准工况下的制热量; K1 ...

  8. 计算器算贝塞尔公式_最新狗狗年龄换算公式出炉!2岁居然这么老...

    狗狗年龄换算成人类年龄到底怎么算? 很多朋友都会说:乘以7不就好了? 其实,乘以7只是一种简单粗略的方法,这种计算方法并不是很准确. 国外遗传学家Tina wang提出了一个更加精确的计算公式&quo ...

  9. 计算器算贝塞尔公式_工程造价算量表+工程量软件,超多表格可套用,高清下载...

    工程造价算量表+工程量软件,超多表格可套用,高清下载 工程预算,其实没什么高深的技术,能看懂图纸,能把科学计算器用熟的话,那工作就更简单了.预算员很好做,特别是从技术口转到预算口,那就更容易了.做预算 ...

最新文章

  1. PHP源代码分析-字符串搜索系列函数实现详解
  2. matlab中句点,matlab入门学习(一)
  3. mac下iterm配色、半透明与样式设置
  4. js中注册标识符流程
  5. 禁用应用中Android系统的导航栏(特别是平板)
  6. Vue页面跳转后不显示问题
  7. The 15th UESTC Programming Contest Preliminary D - Destr0y City cdoj1558
  8. android 自动打包工具,AutopackingAndroid
  9. 读取Flash w25x64未响应 导致卡死的问题
  10. 计算机智能化弱电设备发展趋势,中国弱电智能化发展趋势
  11. 自定义IP在PCIE中使用
  12. 学术论文投稿与返修(Rebuttal)经验分享
  13. PPT创作技巧及有用素材
  14. 双系统安装,错误:验证无效shim签名?
  15. 拼图android系统程序,2021手机照片拼图软件
  16. Linux系统时间同步方法小结
  17. 网页提示404什么意思
  18. 数据库备份还原与分离附加
  19. ES6 -- 简单笔记总结
  20. 像素工厂如何显示服务器列表,萌新如何快速解锁像素工厂炮台科技

热门文章

  1. 【前端学习记录1】HTML简介和开发工具
  2. shutdown参数Linux,shutdown参数(linux命令shutdown参数)
  3. 【Java 8 新特性】Java Comparator.thenComparing | 添加次级排序方式
  4. cad图纸怎么转换成pdf格式?
  5. win7计算机个性化,win7系统没有个性化怎么回事_win7系统右键没有个性化如何处理-win7之家...
  6. no such window: target window already closed
  7. 将表插入PowerPoint 2007
  8. 使用IIS服务搭建一个本地的局域网服务器-共享自己发布的网站
  9. 零售终端检查的重要性
  10. python inspect