Other articles


  1. UV采样值域问题

    试想一下这样的情境,有一个地图需要显示,这个地图需要的精度非常高,常用的做法就是用几个较小的贴图拼在一起,只有镜头里出现需要显示的部分再加载。当这个贴图是高度图时,需要考虑的一点就是如何让相邻的两个高度图完全一致,避免相邻的网格因为高度不一致导致缝隙出现。最近在拼合高度图的时候,就遇到了相邻贴图值对应不上的问题。

    首先考虑的是采样方式的问题,因为Unreal引擎默认的双线性采样(Bilinear)会导致图的边缘采样的值不一样,左边图片采样到最右边的时候,只有上下左三个像素点做混合,反之亦然。那么改成点采样的方式呢?确保左边贴图采到最右边的像素点,右边贴图采到最左边的像素点,这两个像素点只要颜色值一致,那么出来的高度信息一定就是一致的。抱着这样的想法,我尝试了一下点采样,然而出来的结果仍然不对,两边的高度还是稍微有一点点缝隙存在。用RenderDoc查看渲染时用到的高度图,对应的贴图位置的颜色都是一致的,左边贴图最右边的颜色值跟右边贴图最左边的颜色值一模一样,这就非常奇怪了。

    经过了数个小时的研究后,我们终于发现了问题的所在,那就是从网格像素点到实际贴图采样点之间的映射实际上并不是直接的坐标对应关系。在实际采样贴图的过程中,不管贴图分辨率多么的大,每一个像素点都是一个固定大小的矩形,而采样的时候只能采样贴图上面一个确定的点,那么这个像素点Pixel在贴图像素Texel的中心还是在边缘,计算出来的结果显然是不一样的。

    Mapping Texels to Pixels

    翻阅了微软的官方文档,我们可以看到从Direct3D 10开始,像素的坐标系统就改为了从贴图像素(Texel …

    read more

    There are comments.

  2. UGUI的基础知识

    最近在处理UGUI的效率问题,所以顺便翻译一下Unity UI的相关文档,以供查阅。

    基本概念

    Canvas(画布)组件是所有UI元素都需要用到的类,通过 Canvas 组件,UI元素的顶点和面得以映射到世界坐标系中,并根据 Canvas 的设置决定如何绘制。一个很神奇的地方就是,当创建一个 Canvas 元素的时候,场景里会出现一个非常硕大的平面,相对于普通的模型而言非常巨大。

    image_1

    图中红框里的立方体的边长是1米,旁边巨大的白色细框是 Canvas 的范围,可以看到比立方体大很多。造成这个现象的原因是UI在 Scene View 视图中绘制时,用的是1个单位对应1个像素绘制的,而在世界坐标系中,1个单位就代表了1米。

    Canvas 并不是每一帧都在刷新,而是当底下的UI元素需要重新合批(rebatch)的时候才刷新,这个时候 Canvas 被认为是有修改的(dirty)。另外,顶点和面的几何信息并不是 Canvas 直接收集的,而是通过 Canvas …

    read more

    There are comments.

  3. Fractal

    这篇文章来自Alan Zucconi的博客,原文链接: http://www.alanzucconi.com/2016/08/17/fractals-101/

    Alan还写了很多关于Unity教程的博客,写的都非常好,推荐大家去看一下。


    这个系列的教程将会解释分形这个概念,为什么它很重要以及我们能够从中学到什么。本文将浅要地概述迭代分形和分形维度的概念。

    分形这个概念在自然界中很常见,因此这个系列非常适合那些想在游戏里模拟一个真实的户外环境的人,包括所有的美术和游戏开发人员。

    简介

    拿我们非常熟悉的球体举例,平时我们观察球体时觉得它的面是一个曲面,如果你以非常近的距离观察球体,你会发现当距离足够近的时候,整个球面就好像平面一样。这种情况就好像我们每天观察地球一样,我们生活的地方看上去就是一个很大的平面,但实际上地球是圆的。除了地球,其他任何形状的物体也是一样,即使是最精细的多面体,离得足够近时也依然是平面构成的。简而言之,所谓球体这个概念,只有在一定距离观察才有意义。这个概念如此的显而易见,似乎我们可以认为所有物体应该都有这样的特性。但还是有一些特别的几何体超出了这个概念的范围,这种特殊的形状能够包含无限层次的精细程度,我们称之为分形。这种物体具有一种奇特的特征,不管我们以多么近的距离去观察它,它的细节程度丝毫不会损失,反而会越来越精细。更为奇特的是,有一些分形会具有一种叫做自相似性的属性,观察某一部分的细节时,会发现这一部分具有跟整体一样的复杂度 …

    read more

    There are comments.

  4. iOS Code Signing

    最近回顾一下iOS的开发,有一些基本的问题都没有搞清楚,于是打算边学习边整理。Code Signing这个问题算是一个很基本的问题了,但是有时候却经常在处理这个问题上面花时间,毕竟这是真机调试必须经过的一关。

    以下内容参考raywenderlich.com,也可以直接看中文翻译版:(译)iOS Code Signing: 解惑

    Code Signing为何如此重要

    为了让app能够顺利在手机上安装,code signing是必不可少的一步。如果只想在模拟器或者越狱过的手机上跑,那倒是可以完全忽略这个问题。除此之外,真机测试,发布企业版,发布App Store版本,都需要经过code signing。当然了,有时候在Xcode里面点击一下Fix Issue按钮,Xcode会自动帮你解决问题。在某些情况下,Xcode也会失灵,这种情况绝大多数是因为没有安装开发者私钥。

    公钥和私钥

    那么什么是密钥呢?当然就是别人不知道的东西了。用来给内容加密的东西都可以称作密钥。

    在密码学领域,存在着两种加密方式,一种是对称加密,另一种是非对称加密。像我们熟悉的莫尔斯电码用的就是对称加密,只需要知道一种加密方式,就既能用来加密内容,也能用来解读被加密过的内容。

    非对称加密就厉害多了 …

    read more

    There are comments.

  5. iOS创建颜色的一个简单方法

    Objective-C里面通过RGB值的方式创建一个UIColor的对象很简单,只需要传递给指定的RGB值就可以了:

    + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
    

    不过这个方法有一个问题,就是这里面的RGB值是用0~1.0的浮点值来表示的,对于常用的0~255的表示方式以及类似FFFFFF的十六进制表示方式并没有对应的方法。我比较喜欢通过Category的方式扩展UIColor,只需要在工程里面添加一个类就行了:

    UIColor+CreateMethods.h
    
    //
    //  UIColor+CreateMethods.h
    //
    
    #import <UIKit/UIKit.h>
    
    @interface UIColor (CreateMethods)
    
    // wrapper for [UIColor colorWithRed:green:blue:alpha:]
    // values must be in range 0 - 255 …
    read more

    There are comments.

  6. iOS推送机制的隐患

    最近在研究iOS的推送系统,虽然配置起来稍微麻烦了一些,但是实现的原理并不复杂。简单来讲,就是通过app向APNS(Apple Push Notification Service)发送一个注册的请求,等到APNS同意之后便会发回设备的ID。在这个过程中,用户是可以一开始就选择是否接受推送通知的,如果用户不同意接收推送通知的话那么APNS也会收到用户的选择而不再发送推送通知,直到用户修改设置里面的选项。

    现在的一个问题就在于,推送通知在app没有打开的情况(或者打开以后进入后台)下,是iOS系统自己处理的。这就造成什么问题呢?应用在没有使用的情况下,是没有办法处理接收到的推送通知的。比如说一个新闻客户端,如果想在收到推送通知的时候弹出提示框显示最新的新闻,这是无法办到的,除非用户在设置里面将推送的显示修改成提示框形式。这样有一个好处就是,应用程序无需关注程序没有打开情况下对推送的信息的处理,同时也节省了系统的资源,不需要每一个程序都监视推送信息的接收。

    直到现在都一切正常,没有什么大问题。但是最近突然发现了一个很致命的安全隐患,就是假如用户卸载了app并且重新安装回去,即使用户不打开app也能收到之前用户的推送信息。这代表什么呢?假使用户卸载了应用程序但是没有删除用户信息,那么接下来的用户如果安装了同一个应用并且并没有登录进应用程序,那么他照样可以收到之前用户的推送信息。这是什么原因呢?iOS在卸载用户程序的时候不会告诉给应用程序提供者,因此假如该用户没有在新的设备上登录的话,那么应用程序提供者将会继续发送该用户的推送信息给该设备。当设备重新安装上app的时候,就会接收到之前用户的推送信息,只要这位用户还没有登录自己的账号 …

    read more

    There are comments.

  7. Three.js赛车游戏

    赛车坐标系

    先不讨论场景和光线的配置,光是赛车本身涉及到的一些座标变换就足够复杂的了。先假设汽车模型摆放在坐标轴中心,如下图所示:

    Car icon

    一般情况下坐标系为右手系表示,即图中的红,绿,蓝分别代表x,y,z轴。假设汽车要向前移动的话,那么车身和车轮都需要沿着坐标系z轴作平移变换,同时前轮需要绕着前轮车轴为中心沿着x轴方向旋转变换。直白地说,就是车子在往前走的时候轮子也需要滚动。

    直行时的情况比较简单,但是如果需要旋转就比较麻烦了。先来考虑真实的情况,轮子在转动的时候不是一下子就旋转到位的,而是有个缓慢转动的过程,在转动的过程中车身也一直在前进。我们需要记录下来车身此时面对的方向以及轮子此时面对的方向。我们需要将坐标系拆分成两个部分,一个是车子和整个场景所在的世界坐标系,一个是以车子自身位中心的单位坐标系。我们需要在单位坐标系下对轮子做相对于车身的座标变换,在世界坐标系下更新车子当前的座标和面对的方向。

    前期准备

    实际上上面的内容Three.js里面的例子已经有现成的代码了,之前还花了好多时间研究诸如cannon.js,Physijs等等JavaSript物理引擎,出来的结果不是车子不停的打转就是动弹不得。还是先考虑没有物理引擎的情况吧。

    Car.js的文件可以在Three.js的github源码中找到,在example目录下的js文件夹里面。也可以在我的github里面这个demo的代码中找到,但是我稍微修改了一下里面的参数。

    首先我们需要将Three.js库以及Car.js添加到源文件当中

    <script src='js/libs/three …
    read more

    There are comments.

  8. 用WebGL编写一个3D图形网站

    自己的学生生涯也差不多结束了,感觉是时候把自己这一年来学的东西做一个总结,顺便回顾一下以前做过的东西。这几天多动动手,争取写多一些内容。

    WebGL简单介绍

    如果有听说过OpenGL的话,那么WebGL理解起来就不是那么困难了,简单来说其实就是OpenGL在HTML5的JavaScript移植版。要是OpenGL没听说过,那就把它当成是一个在网页上的图形引擎吧。我们可以在HTML5的网页上创建Canvas(画布)来配置我们的WebGL绘制图形的过程。

    要想从最基本的开始写一个很简单的程序也不是那么容易的,写过OpenGL程序的人肯定都知道,想要显示一个简单的正方形也不是一句代码就能解决的事。你得设置好视角,然后你得定义绘图方式,标出矩形每一个顶点的位置,再转换到世界坐标系等等。总之就是一切都是计算机图形学基础的东西,要想好好用WebGL这个写一个能看的动画估计就得花好长时间了。所以我们还是用点现成的东西吧,目前关于WebGL可用的库有很多,比较常用的就是Three.js。

    Three.js

    这个库已经写的比较完整了,已经有很多很炫的例子,可以在官网上找到。有了Three.js,很多事情变简单了许多。绘制一个3D画面的步骤就变成这样了:

    1. 在HTML网页里配置基本的画布
    2. 在画布上布置WebGL基本元素,比如立方体,球体等等
    3. 配置好Camera,加入光源,着色器等等
    4. 如果需要的话,加入对输入设备的检测,比如鼠标的点击动作
    5. 最后就是加入一个计时器不断地刷新页面,比如动态显示水面的波纹 …
    read more

    There are comments.

  9. 在香港求学的日子

    早就说要写点有关香港这段日子的东西,一直没有提笔。难得前段时间把网站的架构重新整理了一下,修复了一点bug。趁此机会就写点感悟吧。主要还是针对在CUHK的学习方面。

    初到香港

    作为一个土生土长的广东人来说,香港一直在我眼里停留在电视上播的各种电视剧上,也多亏了这一点我才能听得懂并且勉强能讲一下粤语。实际去的时候肯定还是和电视上有很大不同,比如说香港的地铁实在是太旧了,感觉和北京的十三号线有的一拼,不过这是东铁线的情况。

    然后就是紧张的签合同买家具的过程了。幸亏是在红磡,楼下就有家居市场,但是符合我们理想价位的店实在不多。也就是从买家具的时候开始,我们认识到了香港的物价水平略微有点高,于是没钱就成了我们生活的主旋律。

    香港对于留学生的意义

    我觉得生活方面实在是没什么可写的了,还是讲讲留学香港的东西吧,正好之前也有人问我这方面的事。首先要说的一点就是学位的事情,香港这里的学位主要分为三种:PhD,MPhill,MSc,这是针对工科的。因为PhD和MPhill要套瓷,还可能要写点research proposal之类的,对于主要想读个硕士的人来说可能不太合适,很多人更关注MSc的含金量。因为本人也是读的MSc,我想讲一讲我的看法。

    对于大部分专业的full time MSc来说,一般课程只需要上一年,然后在次年的年底拿到毕业证。于是在课程结束的5月,或者如果有summer term的话就是7月,一直到拿毕业证的12月之间都是没有课的。加上办理留服的学位认证,可能这些东西要到毕业第二年的1月才能拿齐。所以在找工作的时候一般会有两种选择 …

    read more

    There are comments.

Page 1 / 2 »

links

social