Name on a book

记录一次参与翻译一本外文书的过程, 过程有点累, 结果有点甜.

you know, it is funny that people do not care your name, until you are in trouble. -- 美剧<疑犯追凶>第一集里面的话, 类似而已哦.

去参与翻译一本书, 可以出现在书店书架上的, 还提到你的名字, 是不是很cool?

昨天看到email, 被告知我有份参与的书终于上架了, "在各大网店都有售。但是样书会比较慢" 里面上google一下,果然在amazon.cn等都找到了:

交互式程序设计第2版                                                               
 ~ Joshua Noble (作者), 毛顺兵 (译者), 张婷婷 (译者)                
出版社: 机械工业出版社; (2014年8月15日)                 
语种 简体中文                            

是的 ...

more ...

conflict by duplicated variables

用多于一个变量来表示一个状态, 变量之间很容易不一致呢.

conflict

假如我们要描述以下这个状态:
在一次mouse click的picking中, 我们给出了pick的范围, 一个rectangle, 然后要标记是否只要pick一个物体object就够了, 还是pick所有在rectangel下面的物体.

当假如我们只要pick到一个物体就够了, 那可能在for里面, 一旦找到某一个物体有效, 我们就可以返回, 退出pick过程了. 也就是我们只要pick到第一个有效物体就ok了, 而不考虑这个pick到的物体是否距离mouse click的点最近.

那么, 要记录这个状态, 我们看下面的实现:

class XViewContext            
{               
public:                           
    PickingResult pick(...);                               
    void setPickSingle(bool b) { m_bPickSingle = b; };                      
    bool pickSingle() const { return m_bPickSingle; };                
private:               
    bool m_bPickSingle;                   
};                           
PickingResult XViewContext::pick(...)           
{                    
    ...                                
    if ( pickSingle() ) ...;                 
    else ...;         
}          

在这实现中, 是否要pick单一个物体的状态作为data member inside ...

more ...

Undo and Redo

Undo and Redo 已经遇到很多次了, 记录一下想法.

So we beat on, boats against the current, borne back ceaselessly into the past. -- The Great Gatsby
所以我们不停地往前划,逆流而上,回到无穷无尽的过去。《了不起的盖茨比》

一个程序假如连undo/redo都没有, 那基本上不是给人用的, 可能只能算是demo.

Undo/Redo

用windows/paint画图工具做例子就很直观啦.

case 1. 假如操作次序是: 画一笔A, 再画一笔B; undo 一次就是剩下A; undo 第二次就是空; redo 一次就是增加A; redo第二次就是恢复到A B; 这个case的特点是undo到底了,再redo到底. 没有undo的时候又夹着redo ...

more ...

why game developers keep getting laid off

翻译了一下why game developers keep getting laid off这个文章. 里面有些观点是挺有意思的.

引言

在Hacker News上看到此文, Why Game Developers Keep Getting Laid Off by Jason Schreier http://kotaku.com/why-game-developers-keep-getting-laid-off-1583192249 I enjoyed this article, thx. 稍微摘录和翻译一下.

Why does this happen so often?

... 为什么裁掉一些开发,几个月之后又要重新请人?这个想法好像有点傻啊。但是这种事情却常常发生。根据Sony的某前员工,其中的解释很简单:在开发的前期(游戏的概念和设计是在这期间完成),不需要那么多人,所以发行商就不养人。 ...

A deadline's ...

more ...

build error from line ending

Build error, 具体是error C4335: Mac file format detected: please convert the source file to either DOS or UNIX format怎么办呢?

故事的开端是checkin了一个.cpp,当然本地是build过的,但是server端那边反馈说build error, 具体是 error C4335: Mac file format detected: please convert the source file to either DOS or UNIX format

怎么办呢?当然是查看一下到底是那个.cpp文件的line ending是什么东西,然后改成合适的就ok了.

下面截图显示改之前是CR+LF, 改之后是LF的 ...

more ...

algo - counting inversions

算法练习: counting inversions

Background

Given an array, say [1, 3, 5, 2, 4, 6], to count the inversions. What is an inversion ? if (i < j) but arr[i] > arr[j]. 例如上面的(3, 2), 3在2的前面, 但是3>2, 构成一个inversion. 这个例子中一共三个inversions(3, 2) (5, 2) (5, 4).

这个计算有什么用呢? 我是[Algorithms: Design and Analysis ...

more ...

partio

本来是在找point clould读入的资信, 如point cloud to maya, 遇到partio这open souce project, 读读它的代码应该能学到东西, 于是故事就开始了.

引言

本来是在找point clould读入的资信, 如point cloud to maya, 遇到partio这open souce project from Disney Animation, 读读它的代码应该能学到东西, 于是故事就开始了.
“The goal of Partio is to provide a unified interface akin to unified image libraries that makes it easier to load, save, and manipulate ...

more ...

Vector based containers

在代码中std::vector经常被用到吧? 因为它很容易用, 只管往里面塞东西就ok了. 但是用!=用得好, 而对它的了解又是否足够把它用好呢...下面是在阅读参考文章时候的笔记.

引言

Using STL Vectors

在代码中std::vector经常被用到吧? 因为它很容易用, 只管往里面塞东西就ok了. 但是用!=用得好, 而对它的了解又是否足够把它用好呢...下面是在阅读参考文章时候的笔记.

Prefer vector over list

比较 std::vector 和 std::list, 其中一个特定是, vector的内存是连续的(contiguous buffers), 还可以避免avoid内存动态分配memory allocations和四散的访问scattered access. 这些都是优势.

这里发散一下,以前在用Qt 4.8的时候(以后Qt 5可能有变),就有QVector, QList, QLinkedList,它们的区别也有意思。其中QVector跟std::vector类似 ...

more ...

Pointer to Member Function

function pointer是知道的, 如

int max( int a, int b) { ... };

int (*pFtor)( int, int ) = &max;
int iResult = pFtor(1, 2); 

or

typedef int(*FtorType)(int, int); 
FtorType pFtor; 
pFtor = &max;
int iResult = pFtor(1, 2);

但是当看到类似以下代码时候还是恐惧了一下:

class Tool {
    int doA(ArgumentType &);
    int doB(ArgumentType &); 
}; 
typedef int(Tool::*MemberFunctionPtr)(ArgumentType &);


Tool toolObj ...
more ...

In the middle of time and space

刚发生了一个有意思的事情, 5月9号16:40

小伙C说了一段话; 小伙B回答了一段话;

小伙C是在北美西海岸, 跟我们差16小时; 小伙B是在英国.

那么C大致是5月8号深夜, B可能是9号早上.

过去和未来的对话,我们夹在时空中间,旁观.....

more ...

Example of code conventions

刚看到如下代码:

// NvGLModel.h from nvidia samples 

    nv::vec3f m_center; ///< The computed center of the bounding box of the app

private:
    NvModel *model;
    GLuint model_vboID, model_iboID;
    nv::vec3f m_minExtent, m_maxExtent, m_radius;

觉得别扭,主要是有些成员变量data member用来m_,而有些不用,不统一。所谓的taste?

btw, 反例的英文原来是: counter example; negative example

more ...

Picking with OpenGL

If you have choices, choose the best. If you have no choice, do the best. 如果有选择,那就选择最好的;如果没有选择,那就努力做到最好。

Picking with OpenGL

在3d软件提供交互的时候,例如先选择了某个vertex或者某个face,然后去操作这个被选中的东西。如在maya里面很多工具(maya里面把context==tool?)都是先pick the manipulator, drag the manipulator, to update the attributes of the node (the selection list). 第一步就是要选中mouse底下的东西,这是怎么做到的呢?

其实一开始我想到的方法ray intersection的方法, approach 0 ...

more ...

choose the overrided function

In class hierarchy, if functions are overrided by some subclass, which one will be invoked?

more ...

Do and redo are similiar

在学maya/MPxCommand, 当一个操作需要支持undo/redo的时候,用户操作的次序可能是: - do sth -> undo it, or - do sth -> undo it -> redo it; 在实现的时候会发现do sth 跟 redo sth的代码基本一样啊,那当然想写一个都被do and redo调用的函数就好了,避免代码重复嘛。

maya/devkit的例子所使用的方法是:

//code  
// inside class CommandXY 
virtual bool isUndoable() const { return true or false; }
virtual MStatus doIt( const MArglist & )
{
    // parse the argument list;
    // do some ...
more ...

How to build a plugin system

Applications normally support custom plugins, how to do that?
很多软件都提供了API给customer, 可以写plugin来扩展原来的程序.

例如mudbox和maya. 从mudbox的API来看,一般可以实现 - 自定义operation, support undo and redo; - 自定义某种brush (operation); - 继承实现某个类,代替原有的那个. 例如map extraction? 当前接触到的maya api不多,知道plugin可以实现context and manipulator.

问题就来了, 一个简单的plugin system是怎么设计和实现的呢?

case 1: Reference: Using Dynamic Link Libraries (DLL) to Create Plug-Ins, by Jeremiah van Oosten. http://3dgep ...

more ...

Maya Programming Node

学maya时候有些新概念要记录一下,否则忘得快.

先在一个新场景里面拖一个多边形球polygon sphere出来,
transfrom and shape node 打开Outline窗口, 看到一个pShere1, 选择Display/Shapes, 又看到pShere1下面还有一个pSphereShape1. 而在hypergraph: connection 窗口看到一共四个东西, 其中两个就是上面的pSphere1 and pSphereShape1, 而且其中三个是有连接关系的。从左到右它们分别是:
+ polySphere1: 控制参数, 例如半径radius, axis/height上的布线密度等;
+ pSphereShape1: 这个就是实际的shape node, 形状.
+ initialShadingGroup: 用于画这个球的.
+ pSphere1: transform node, 决定了球在空间位置.

import maya.cmds; 

maya.cmds.polySphere()                  # 用script建一个球 
# Result: [u'pSphere2', u'polySphere2'] # 返回就是transform node, shape node. interesting part ...
more ...

simple implement of 2d bezier curve

工作中又一次遇到nurb curve的问题,具体是knots个数和求法的问题。那东西太难,相对来来说,bezier curve易懂很多,一直想实现一下来看看,于是就有了此。

more ...

Flood fill

看见someone提到Flood fill algorithm, 惭愧,不熟悉这个名字,于是Google一下,竟然跟BFS很像,于是想着要简单实现一下。

more ...

How to debug maya custom plugin

涉及maya plugin开发的时候,怎么debug呢?

Attach to maya process ... 寄生

step 1. maya plugin manager (Window -> Settings/Preferences -> Plug-in Manager)中load your custom plugin. This plugin need to be built by the same compiler version of maya, 也许不需要. step 2. at your visual studio project of that custom plugin, Tools -> Attach to ...

more ...

Tree view at Qt

Qt中的TreeView很复杂, 记录一下自己的理解.

引言

Model/View/item的关系就有点像Container/Algorithm/Iterator的关系。 Tree view属于Model/View Programming的一部分。有些

Index 带上下层级结构的二维索引

QModelIndex()表示model中最上层的root item的index, QModelIndex().isValid() == 0.

item之前有上下层级关系,index.parent()获取index的parent. 当index.parent().isValid() == false,表示这个item的parent就是root item. 这些items被称为top-level itmes.

to retrieve data from a model: for (int row = 0; row < model->rowCount(parentIndex); ++row) { for (int ...

more ...