公告

大家好,我们决定暂时停止开发Wonder,但会继续维护当前的Wonder版本(如继续维护官网、在线编辑器、QQ群等)。

我们当前的主要任务是 写书:基于Wonder 1.0版本的开发经验,写一本 “开发3D引擎和编辑器”的实战类型的书,欢迎大家关注~

写书计划

之前我写了《用函数式编程,从0开发3D引擎和编辑器》系列中的前3篇文章,主要从 思维 层面来讨论设计和开发过程。

不过我认为这样的效果并不好,因为大部分读者都没有自己动手写过3D引擎,对他们来说,思维层面的讨论太过空泛。

因此我决定,本书从 实战 层面来讨论,让读者能真正跟着本书,一步一步地写出3D引擎和编辑器,真正体验到其中的快乐和成就感。

暂定书名

《3D编程旅程-从0开发3D引擎和编辑器》

我准备在“3D编程”的主题上写一系列的书,该系列暂名为“3D编程旅程”。后续可能会有《3D编程旅程-应用》、《3D编程旅程-模式》、《3D编程旅程-测试》等书。

主题

本书使用函数式编程范式,从0开始,通过一行一行的代码,写出了 简易的、完全可运行的 3D引擎和编辑器。

在线预览和反馈

在线阅读

读者反馈QQ群:
106047770

技术栈

篇幅

本书保持精简,专注在实现最小功能上,因此使用较少的篇幅。

规划

4个月完成初稿,6个月发布

总字数20w字以内

总页数400页以内

策略

  • 尽量多章节,每个章节内容尽可能独立和精简,减少读者负担

重点

  • 设计
    3D编程比较复杂,要让各个部分统一协调地工作,还要尽量地提高性能、增强扩展性。
    本书会展示很多设计层面的思考,仔细地设计架构,不断地重构,提高代码质量。

  • 实现
    本书旨在让读者以最小的成本,快速实现一个简易的3D引擎和编辑器。因此,本书不讨论 测试工程化 等内容。

特色

1.完全从0开始,强调实战

2.保持精简,只实现核心功能

3.完全、彻底地使用函数式编程。

现在3D领域使用函数式编程的资料很少,主流还是使用面向对象。
我以前也是用面向对象,不过自从我开始接触函数式编程,就拥抱了它。
面向对象很好,函数式编程也很好。使用哪一个,是每个人的自由。

本系列希望能扩展大家的视野和思维,展示函数式编程的魅力。

4.不仅探讨3D引擎,而且以编辑器作为主线。

讨论编辑器的资料很少,讨论3D引擎+编辑器的更少。

本系列完全基于我们的实战经验,以编辑器作为主线,3D引擎作为底层实现。

5.类型驱动设计。
尽量用类型和伪代码来探讨设计。

能给你带来什么收益?

1.读者能够在本书指引下,从0开发自己的3D引擎和编辑器

2.学习函数式编程及其在3D领域的应用

3.学习3D编程中基础的功能实现,如纹理、光照、模型等

4.学习设计和架构,如Data Oriented、多线程、管道job等

目标读者群

尽管本书使用的是WebGL这个Web 3D编程的API,但本书的设计和实现的思想是通用的,适合整个3D编程领域。

  • 3D编程爱好者

  • 函数式编程爱好者

  • Web 3D开发工程师

  • 3D引擎开发工程师

  • 3D编辑器及工具开发工程师

章节安排

第一部分:基础准备

  • 函数式编程思想

  • Reason语言基础语法

  • WebGL基础

  • 开发环境准备

第二部分:实现Demo

  • 快速写一个最小Demo

  • 提出3D引擎

  • 提出编辑器

  • 优化

第三部分:提出基本架构

  • 提出基本架构

  • 改进引擎架构,支持多种应用场景

  • 改进引擎,支持多线程

  • 重构:提出微服务

第四部分:增加功能

  • 编辑器增加Redo/Undo功能

  • 编辑器增加场景管理功能

  • 编辑器增加Inspector功能

  • 编辑器增加控制台功能

  • 增加camera

  • 编辑器增加run/stop功能

  • 编辑器增加grid plane 功能

  • 编辑器增加camera/light gizmo功能
  • 编辑器增加资产功能
  • 增加light material组件
  • 增加texture
  • 编辑器增加导入/导出功能
  • 编辑器增加发布本地包功能

  • 增加event

  • 编辑器增加picking功能

  • 编辑器增加显示轮廓功能

  • 编辑器增加transform gizmo功能

  • 编辑器增加pwa功能

相关资料

Wonder官网
用函数式编程,从0开发3D引擎和编辑器系列

Wonder暂停开发,开始写书的更多相关文章

  1. 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(1:概述)

    本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  2. 基于SVN的项目管理——集中与分散

    我们在此处不讨论 GIT 比 SVN 好多少,也不讨论 Maven 和 Gradle 哪个好用,基于现有的开发环境,大多数公司还是采用 SVN + Maven 来进行项目管理——因为这已经满足了大多数 ...

  3. Media PLayer

    PotPlayer http://potplayer.daum.net/?lang=zh_CN KMPlayer 的原制作者姜龙喜先生(韩国)进入 Daum 公司后的新一代作品.PotPlayer 的 ...

  4. SVN的项目管理

    基于SVN的项目管理——集中与分散   我们在此处不讨论 GIT 比 SVN 好多少,也不讨论 Maven 和 Gradle 哪个好用,基于现有的开发环境,大多数公司还是采用 SVN + Maven ...

  5. Alpha冲刺(1/10)——2019.4.23

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  6. Selenium及Headless Chrome抓取动态HTML页面

    一般的的静态HTML页面可以使用requests等库直接抓取,但还有一部分比较复杂的动态页面,这些页面的DOM是动态生成的,有些还需要用户与其点击互动,这些页面只能使用真实的浏览器引擎动态解析,Sel ...

  7. 如何写一个Xss Bot

    如何写一个Xss Bot 现在的ctf比赛里 xss的出题方式比较特殊,一般使用xss bot,所以借鉴大佬经验尝试弄一个xss题目. xss bot 就是代替管理员去完成点击页面的任务,bot需要能 ...

  8. 「小技巧」使用Git从其他分支merge个别文件

    小明发现在实际项目开发过程中,总会遇到各种各样的情况,比如一个大型的项目或版本迭代可能不是一次上线,可能会分好几次上线,这时候就会涉及创建多个分支,分别开发. 项目背景 产品经理:我们本次开发三个功能 ...

  9. Puppeteer学习笔记 (1)- 什么是Puppeteer

    本文链接:https://www.cnblogs.com/hchengmx/p/11006263.html 1. phantomjs介绍 在介绍puppeteer之前必须介绍一下phantomjs,p ...

随机推荐

  1. 【Luogu P3384】树链剖分模板

    树链剖分的基本思想是把一棵树剖分成若干条链,再利用线段树等数据结构维护相关数据,可以非常暴力优雅地解决很多问题. 树链剖分中的几个基本概念: 重儿子:对于当前节点的所有儿子中,子树大小最大的一个儿子就 ...

  2. 【NHOI2018】找素数

    [题目描述] 素数又称质数,是指一个大于 1 的正整数,如果除了 1 和它本身以外,不能再被其它的数整除,例如:2.3.5.97 等都是素数.2 是最小的素数. 现在,给你 n 个数字,请你从中选取一 ...

  3. day 28 黏包 ssh模块 subprocess模块

    套接字的信仰 一切皆文件 昨日作业: import socket sock=socket.socket() # TCP协议 IP_PORT=("127.0.0.1",8899) s ...

  4. RobotFramework自动化测试框架-Selenium Web自动化(三)关于在RobotFramework中如何使用Selenium很全的总结(下)

    本文紧接着RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)继续分享RobotFramewor ...

  5. [ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?

    标题反映的是上周五一个同事咨询我的问题,我觉得这是一个很好的问题.这个问题有助于我们深入理解依赖注入框架在ASP.NET Core中的应用,以及服务实例的生命周期. 一.问题重现 我们通过一个简单的实 ...

  6. java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type

    今天做项目测试接口,查询数据时出现以下错误,记录一下. 查询语句和错误信息: 实体类属性 原因是 由于字段 total和receive 在实体类中使用的是 int类型,但是数据库中查询出来的数据为nu ...

  7. MyEclispe启动Tomcat7时出现错误The servlets named [LoginServlet] and [com.liu.control.LoginServlet] are both

    刚开始尝试写Servlet代码,第一天就碰到这个错误,在网上找了很多资料才找到解决办法,在此记录一下. org.apache.catalina.LifecycleException: Failed t ...

  8. ASI中POST请求和文件下载

    //POST请求 1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.URL NSURL *url = ...

  9. Android Activity生命周期及启动模式

    曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...

  10. 2019-2020-1 20199304《Linux内核原理与分析》第三周作业

    1.操作系统是如何工作的? 计算机三个法宝(3个关键性的方法机制): 存储程序计算机.函数调用堆栈.中断机制. 1.1堆栈: 在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构.堆栈都是一种数 ...