项目来自tinyrenderer ,作者尝试用500行代码来写一个tiny render,让我们来明白OpenGL是怎样工作的,同样,这个系列可以理解为我的读书笔记或者心得或翻译。

从画点开始

TGAImage

生成图像我们使用TGAImage,这个使用起来很简单:

#include "tgaimage.h"const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red   = TGAColor(255, 0,   0,   255);int main(int argc, char** argv){TGAImage image(100, 100, TGAImage::RGB);image.set(52, 41, red);image.flip_vertically(); // i want to have the origin at the left bottom corner of the imageimage.write_tga_file("output.tga");return 0;
}

生成的图像(注意中间哪一个小小的红色点):

KrisYu/tinyrender​github.com

compile:

g++ main.cpp tgaimage.cpp -o main

wavefront obj

然后我们来学习一种3d格式文件,wavefront obj file:

# List of geometric vertices, with (x, y, z [,w]) coordinates, w is optional and defaults to 1.0.v 0.123 0.234 0.345 1.0v ......# List of texture coordinates, in (u, [v ,w]) coordinates, these will vary between 0 and 1, v and w are optional and default to 0.vt 0.500 1 [0]vt ......# List of vertex normals in (x,y,z) form; normals might not be unit vectors.vn 0.707 0.000 0.707vn ......# Parameter space vertices in ( u [,v] [,w] ) form; free form geometry statement ( see below )vp 0.310000 3.210000 2.100000vp ......# Polygonal face element (see below)f 1 2 3f 3/1 4/2 5/3f 6/4/1 3/5/3 7/6/5f 7//1 8//2 9//3f ......# Line element (see below)l 5 8 1 2 4 9

我们现在只需要知道了解顶点是v,现在我们想把一个文件中的3d模型的顶点 v (x, y, z) 给画出来,(因为我们已经知道怎么在图上相应的位置放像素)这个文件所有的 x, y, z ∈ [-1, 1],所以我们

  • 需要把它们映射到合适范围。
  • 然后注意我们画的点 image.set(52, 41, red);, 这里的 52 和 41 是 int,映射之后需要转成int,因为我们总是画在一个一个像素点上。

写一个简单的parser读入文件建立模型,画之。

核心部分长这样:

for (int i = 0; i != model->nverts(); i++) {Vec3f v = model->vert(i);Vec2i p = world2screen(v);image.set(p.x, p.y, white);
}

KrisYu/tinyrender​github.com

compile:

g++ main.cpp tgaimage.cpp model.cpp -o main

opengl画三维点_[500行代码学懂OpenGL]之一画点相关推荐

  1. 代码画简单动物_[500行代码学懂OpenGL]之六数学知识

    数学知识 之前我们说有三个方向可以走 - 光.纹理.数学.然后我们简单看了一个光的例子来学习z-buffer和纹理,现在我们来看一下相关的数学知识.这些也很重要. 需要了解的概念包括: 矩阵是如何变换 ...

  2. 重心模型选址代码_[500行代码学懂OpenGL]之四z-buffer

    z-buffer 简单光 我们现在先复习一下,我们经过了画点.画线,填三角形之后已经能画出来一些东西了,现在我们有好几条路可以走,那就是 光(上帝说"要有光") 纹理(不然就填白色 ...

  3. python代码示例500行源代码-500行代码使用python写个微信小游戏飞机大战游戏

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...

  4. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  5. python split函数 空格_python上手--10行代码读懂红楼梦

    取名10行代码看懂红楼梦,是将介绍使用python代码来读红楼梦获取其主要人物.这里的思想就是词频统计,通过分析红楼梦小说文字中出现最多的词语,来概括说明红楼梦的核心人物和事情.实际上如果你能跟着往下 ...

  6. 压缩过的js代码怎么还原_码农晒出一段代码:500行代码没有一字注释,这种情况怎么应对?...

    对于程序员经常提到的"代码",从某种程度上来讲就算是机器码,因为这个东西机器很擅长读,不论写的怎么乱,怎么压缩混淆,在机器看来都是一样的,而人就不一样了,哪怕是能力再强的程序员,代 ...

  7. TinyRenderer(1):500行代码实现软件渲染器

    Lsson 0 从头开始 这是一个微型软件光栅化程序,如果您正在寻找一个微型软件光线跟踪器,则可以在此处找到它. 我的源代码无关紧要.阅读本文并实现自己的渲染器.只有当您经历所有细微的细节时,您才能了 ...

  8. js 监听 安卓事件_百行代码实现js事件监听实现跨页面数据传输

    百行代码实现js事件监听实现跨页面数据传输 使用场景 类似消息队列的使用场景,支持同页面和跨页面通信,发送消息和接收消息 技术原理 跨页面通信: 基于事件监听,通过监听 storage事件监听回调机制 ...

  9. 从0开始:500行代码实现 LSM 数据库

    简介: LSM-Tree 是很多 NoSQL 数据库引擎的底层实现,例如 LevelDB,Hbase 等.本文基于<数据密集型应用系统设计>中对 LSM-Tree 数据库的设计思路,结合代 ...

  10. 哥们哥们,人机大战晓得吧玩家对战晓得吧,简易三子棋,呕心沥血500行代码手把手带你制作第一个小游戏,可以保存收藏以后接着看哟,最后有源码哦

    目录 前言 一.游戏想要有意思,函数不可少,整活的函数 二.三子棋的游戏界面 三.三子棋的功能步骤分析      1.菜单     2.三子棋实现的总体框架     3.棋盘创建     4.棋盘初始 ...

最新文章

  1. JavaScript对css样式表操作
  2. linux 自动备份脚本
  3. [2] ADB 基本用法
  4. DOCTYPE 声明
  5. com.alibaba.fastjson.JSONException: can‘t create non-static inner class inst
  6. 矩形液体包装纸箱行业调研报告 - 市场现状分析与发展前景预测
  7. 关于Eclipse无法导入包的问题???
  8. 四川开大c语言程序设计0002,C语言程序设计0002.pdf
  9. android4.3模拟器,天心安卓模拟器
  10. Python实现屏幕取色器功能
  11. mysql怎么卸载干净?
  12. 如何裁剪PDF文件的页面大小
  13. Wi-Fi 6 BSS着色和空间重用白皮书
  14. 1、什么是公众号appid?
  15. 有测试狗狗好坏的软件吗,6个测试判断狗狗性格,胆小或凶猛一测便知,你家狗狗是哪种?...
  16. 计算机犯罪率增长,我国的计算机年犯罪率的增长是()
  17. 怎么把视频复制到IPAD
  18. Porteus Kiosk
  19. 干货 实例 | 数字化时代的传统行业转型升级
  20. 枫叶蓝代码生成工具 和对服装行业的一些感悟

热门文章

  1. Atitit  补充说明 sql知识图谱与线路图attilax总结补充说明
  2. paip.中文 分词 ---paoding 3.1 的使用
  3. paip.提升性能--多核cpu中的java/.net/php/c++编程
  4. 编译」(compile),与「反编译」(decompile)..哪些语言容易被反编译.
  5. 2020年度SaaS企业 TOP100
  6. Julia : 在编程中的Unicode 字符
  7. Web开发之旅--使用Flask 实现REST架构的API
  8. [长文科普]浅谈数据湖的应用与安全
  9. 如何确定品种?——期货品种量化分类课题研究
  10. 如何做一个有品位的程序员