十二、项目:编程语言 确定编程语言中的表达式含义的求值器只是另一个程序。 Hal Abelson 和 Gerald Sussman,《计算机程序的构造和解释》 构建你自己的编程语言不仅简单(只要你的要求不要太高就好),而且对人富有启发。 希望通过本章的介绍,你能发现构建自己的编程语言其实并不是什么难事。我经常感到某些人的想法聪明无比,而且十分复杂,以至于我都不能完全理解。不过经过一段时间的阅读和实
击球手击出垒球,你会开始预测球的轨迹并立即开始奔跑。你追踪着它,不断调整你的移动步伐,最终在观众的一片雷鸣声中抓到它。无论是在听完朋友的话语还是早餐时预测咖啡的味道,你时刻在做的事就是在预测未来。在本章中,我们将讨论循环神经网络 -- 一类预测未来的网络(当然,是到目前为止)。它们可以分析时间序列数据,诸如股票价格,并告诉你什么时候买入和卖出。在自动驾驶系统中,他们可以预测行车轨迹,避免发生交通意
尽管 IBM 的深蓝超级计算机在1996年击败了国际象棋世界冠军 Garry Kasparvo,直到近几年计算机都不能可靠地完成一些看起来较为复杂的任务,比如判别照片中是否有狗以及识别语音。为什么这些任务对于人类而言如此简单?答案在于感知主要发生在我们意识领域之外,在我们大脑中的专门视觉,听觉和其他感官模块内。当感官信息达到我们的意识时,它已经被装饰了高级特征;例如,当你看着一只可爱的小狗的照片
注意:此节中用到的颜色和位移纹理是用 Ben Cloward 创建的。 背景 曲面细分( Tessellation )是 OpenGL4.x 中的一个令人兴奋的新特性,Tessellation 主要用于解决 3D 模型的静态属性,包括他们的精细度和多边形数量。具体来说就是当我们近距离观察一个复杂的模型(如人脸)时,我们希望能够看到这个模型的所有细节(例如皮肤的褶皱),所以我们需要使用一个高精细度的
所谓 3D 拾取就是当我们用鼠标点击屏幕上显示的 3D 场景时,我们鼠标选中的那个像素能够映射到实际的 3D 场景中的相应图元上。这个功能对于那些强调交互性的应用程序十分有用,用户只需要进行点击(在 2D 屏幕上)就能这个被点击的位置映射到三维场景中的对象上。例如,你可以使用它来选择某个对象或者其一部分作为目标,并在之后对其进行进一步的操作。在这章的示例中,我们渲染了一些对象并且展示如何将被“选中
天空盒是用于增强场景表现力的一个常用技术,它一般通过在相机周围包裹一个纹理来实现。这个纹理通常是一些天空、山川或者摩天大楼等等,下面是游戏 Half-Life 中使用天空盒的例子: 天空盒的思想就是绘制一个大的立方体,然后将观察者放在立方体的中心,当相机移动时,这个立方体也跟着相机一起移动,这样相机就永远不会运动到场景的边缘。这与我们真实世界中的情况一样的,我们可以看见远处的天空接触到了地平线,但
聚光灯是第三个也是最后一个我们将要介绍的光源类型(至少在一段时间内)。他比平行光和点光源更加复杂,而本质上还是用到这二者的很多内容。我们需要设置聚光灯光源的位置,并且其光照强度随着和目标物距离的增加而减小(像点光源那样),而且他也要指向一个特定的方向(像平行光那样)。但是聚光灯新增了一个特性,它的光只分布在有限的圆锥形空间内并且不断减弱,而这个圆锥形空间随着随着与光源位置的增加,其而底部不断扩大。
当我们在计算环境光照的时候,唯一的要考虑的因素是光照强度;之后当我们计算到漫反射光照的时候,我们将光照的方向因素考虑进去了。镜面反射光包含这些因素,并且增加一个新的因素——观察者位置。这样做的原因是当光线以某一角度照射到一个平面上时,他会以相同的角度反射出去(在法线的另一边)。如果观察者刚好位于这条反射光线的线路上,那么他接受到的光照强度将大于远离这条线路的观察者。 镜面反射光的效果就是当观察者以
环境光和漫反射光的主要不同是,漫反射光的计算需要依靠光线方向而环境光完全忽略了它!当只有环境光时整个场景被均等照亮,漫反射光会使物体面对光的部分比背对光的部分更加明亮。 此外漫反射光还增加了一些新的计算,光线的入射角决定了表面的亮度。通过下面的图片来演示这个概念: 让我们假设两条光线的强度是一样的,而唯一不一样的是它们入射的方向。在漫反射光照模型中,左边物体的表面比右边亮,因为左边的表面相比右边的
在前面的内容中我们看见两种类型的顶点变换。第一种类型的变换是改变对象的位置(平移、旋转)或者尺寸(放缩)。这些变换允许我们在 3D 世界中把一个对象放在任何位置。第二种类型的变换是透视投影变换,把在 3D 世界坐标系下的顶点投影到 2D 世界坐标系下(比如一个平面上)。一旦坐标变换为 2D 坐标,那么我们非常容易的就能将这些 2D 坐标映射到屏幕坐标系下,根据这些屏幕坐标系下的坐标以及其对应的拓扑
在这一节中我们将会介绍如何在保持深度外观的情况下将三维世界中的物体投影到二维平面上去。最有代表性的例子是:当我们站在一条笔直的马路的中间向前看时,我们会发现马路的两边会越来越靠近,并最终汇聚成一个点。这就是图形学中常说的透视投影。 为了实现上面的效果,在本节中我们需要生成一个投影矩阵,这个投影矩阵需要满足能够将所有的顶点都投影到范围位于 -1 到 1 之间的规范化空间中(normalizedspa
在前几章中我们学习了一些变换,通过它们我们能将3D世界中的物体灵活的变换到任意位置。之后我们还要学习两个变换(相机控制和透视投影),但是正如你可能已经猜到的,我们需要一个变换的组合。在很多情况下,你需要缩放物体以适应你的 3D 世界的尺寸,将其旋转到需要的方向,平移到某处等等。直到现在,我们每次都只能使用一个单一的变换。为了实现上述一系列的变换,我们需要用顶点坐标与第一个变换矩阵相乘,然后将前面的
到目前为止,本书介绍过的内容都是和解释器自带的数据结构打交道。我们的程序与外部的交互只是通过input、raw_input和print函数,与外部的交互很少。本章将更进一步,让程序能接触更多领域:文件和流。本章介绍的函数和对象可以让你在程序调用时存储数据,并且可以处理来自其他程序的数据。 11.1 打开文件 open函数用来打开文件,语法如下: open(name[, mode[, bufferi
本节重点: driver.get_cookies() 获得cookie信息 add_cookie(cookie_dict) 向cookie添加会话信息 delete_cookie(name) 删除特定(部分)的cookie delete_all_cookies() 删除所有cookie 通过webdriver 操作cookie 是一件非常有意思的事儿,有时候我们需要了解浏览器中是否存在了某个coo
之前看乙醇视频中提到,selenium 的ruby 实现有一个小后门,在代码中加上$DEBUG=1 ,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据;觉得这个功能很强大,可以帮助理解webdriver的运行原理。 后来查了半天,python并没有提供这样一个方便的后门,不过我们可以通过代理的方式获得这些交互信息; 一、需要安装java 虚拟机与selenium-server-s