Polygonalize Implicit Surface隐式曲面的多边形化
这几天遇到implicit surface (isosurface), marching cube这几个名称,复习了一下,顺便做了下面几个例子来增加理解:
第一行: sphere, sphere被grid切了, 注意保证grid够大.
第二行: box, box with rounding.
第三行: union(box, sphere), difference(box, sphere).
生成mesh之后,然后放到windows 10's 3D Builder中得到的渲染结果。
南海桂城土地交易统计
地图(我感兴趣的区域):
2016/2/18
TD2016(NH)WG0003 佛山市南海区桂城街道天佑二路7、9、11、13号地段
佛山市南海威通有限公司 楼面价 3965元/平方米(=4275万/面积3850.6/容积率2.8)
旧区 旁边没有大公园 虽然靠近桂城地铁站 但是因为南海大道交通很塞车
教育: 桂城中心小学
2016/1/07
TD2015(NH)WG021 南海区桂城街道广东金融高新技术服务区B区03-02-08地块
创新蓝绿投资(北京)有限公司 楼面价 11539元/平方米(=166877万/面积48207.7/容积率3.0)
城镇住宅用地兼容批发零售用地
2016/1/22
TD2015 ...
Maya中的fileDialog2命令
今天在使用maya的fileDialog2 cmd去建一个file dialog, 要求能选中打开多个files, 于是需要使用:
fileDialog2 -fileMode 4 ….;
这里-fileMode=4 表示支持多个文件选择.
问题是执行这个file dialog的时候,右下角两个按钮分别是Save, Cancel. 而我需要是Open, Cancel.
debug时候发现原来是对同一个地方分别两次操作,而产生冲突.
setAcceptMode(QFileDialog::AcceptOpen); // 影响open or save 这个按钮上的字.
setLebelText(QFileDialog::Accept, "Save"); 也是影响用一个地方,但是这个"Save"跟上面的AcceptOpen中默认使用的"Open"就冲突了. 这个函数允许随意改这个角色上的字.
解决方法是使用-okc "Open" flag来明确设置这个accept button上的text.
References: Qt4.8 (or Qt5.6), QFileDialog.
more ...门锁系统的接口设计
想象一个场景:
你要开发一个门锁, 设计好了锁的很多细节: 安全级别, 大小, 外观, 跟什么门相配, 使用细节等等, 但你只是一个设计公司, 这没有关系,
因为在细节都决定好了之后, 只要找一家生产商合作按照你的设计要求来做就ok了, 当然你需要严格的验收测试.
上面那场景是我编造的, 重点是分离了接口的设计和实现.
接口的设计: 这个class需要提供什么信息, 使用者可以通过这些接口得到使用这个class所需要的一切. 注意是使用这个class所需要的, 而不是解构分解这个class所需要知道的一切.
接口的实现: 这是怎么实现, 用什么方法实现, 可能不同的算法, 没有关系, 使用者没有必要知道, 于是这些也没有必要让使用者接触到.
LockManager.h
class LockManager {
LockManager() { sLockManager = this; };
static LockManager &instance() { return sLockManager; };
static LockManager sLockManager;
virtual int getInformationX() const { ...; };
virtual int getInformationY() const ...
Qt上GraphicsView显示SVG
There is a problem came at the daily work, to show a button on a graphics view,
this button is supposed to have the hover state, with an icon, but not general image format, but use SVG.
My first time to use svg image, even i know it is vector ...
2016年02月阅读笔记
"In fact, there is no need to even enforce that the data be related to 3D", Chapter 2, Coomplete Maya Programming.
这个话有意思。假设自己来设计一个3d应用程序,会有建模,动画,光照渲染等功能模块,你会怎么解耦和关联各个模块呢,例如某个模块改变了,别的模块需要怎么更新,会不会麻烦。而maya应用了data flow model,数据在不同模块下流入流出,不同模块就是对这些数据来操作。上面那个引入的话,这些流动的data甚至可以不用看作是3d数据。
例如想到mesh, 什么是mesh? 三维顶点, 用边联系起来,结构halfedge是为了方便访问v/e/f。对mesh操作(sculpt, deform),是对顶点操作,顶点的数目分布坐标等. 我是首先想到了mesh这个东西 ...
Skinning蒙皮技术
Reference: Siggraph Course 2014 - Skinning: Real-time Shape Deformation
more ...2015年11月阅读笔记
2015/11/02 今天读到一个文章: what kind of jobs do software engineers who earn 500k per year do? 里面的故事是 villiage需要工人来为村庄供水,有两类工人: type 1 worker: 拿着两个水桶,到水源的地方装水,然后会村庄,自己和家人分一部分的水,余下给村庄。 type 2 worker: 拿个铁锹去挖水道,从水源到村庄,花挺长时间,这时间里面别人不一定知道他在做什么,可能对他失望,好在村里有些人对他有信心,给他吃,好让他继续。突然一天,他的水道建好了。type 1 worker就失业,要找别工作,而type 2 worker得到了大回报。
工人,在接受任务之后 ...
more ...20150929别逃跑问题
2015/9/29 一个月之前build opensubd的时候遇到一个cmake error:
当时请问了别人没有遇到,也想不到是什么原因。今天重遇这个问题,狠着心慢慢看,对比另一台机器上的build log, 在OpenSubd/cmake/FindDocutils.cmake的执行不一样, 原来是这个机子上安装了C:/Anaconda, FindDocutils.cmake里面被其中一个库影响了。
lesson: 别逃避问题啊, fix it.
more ...texFormat的一次bugFix
故事的开头是有个bug说map extraction的ptex文件file1, 在import as paint layer and export paint layer again之后文件file2的大小相差几倍,怀疑file1跟file2中pixel的value不一样了。
file1.ptex vs. file2.ptex
用ptex代码附带的ptexInfo程序把ptex file的data dump出来, 默认是dump all faces, all levels, 发现数据量太大了。 需要ptexInfo做些修改, 只把个别感兴趣的face的数据输出.
花时间看ptex代码, ptex所调用的zlib可以把压缩关了, 另外ptex还可以关了generate mipmap, 这样ptex写出的数据应该就是没有压缩的而且只有level0的. 所谓的level0就是full resolution.
发现虽然file1.f0, file1.f0, 两者的resolution, pixel size都是一样的, 但是pixel value还是不一样, file1.f0的每一个pixel的RGBA value每一个channel都相对小了0.003左右.
继续追踪, 发现ptex ...
more ...Slide vertex on surface
过年上班没多几天啊, hackathon就开始了, 我报名的project是尝试实现以下paper:
Sliding Deformation: Shape Preserving Per-Vertex Displacement, Dmitriy Pinskiy, EUROGRAPHICS 2010.
本文做一些记录, 特别是有些问题以后可能也会遇到.
想做这个slide brush的原因是: 1. 上面那个paper本身适合放到brush framework里面来做, 做成一个brush; 2. 看上去不是太难, 是有难点(后面会提到), 但是=不是那种求解方程组的优化问题(我还不太懂这个), 估计可以在2天内搞定的, yes, hackathon就2天.
大体做成的效果应该是: brush stroke的时候会带动一些vertices在mesh/surface上滑动, mesh的形状shape被保持。区别于现在mudbox已有的grab brush, 后者顶点跟着鼠标在走,会跑到mesh外面. 区域
算法的输入包括(不限于)下面这些:
+ handle, which is the mouse/brush ...
优化-访问数组值
记录一下学到的一个技术.
假如value[]是一个很长的数组, 记录着某些对象的值, 值的范围是[0, 1]. 它的操作包括:
给value[]初始化为每个元素都是0;
设置某一个元素的值, 如value[vIndex] = x;
访问某一个元素的值, 如x = value[vIndex];
虽然数组很长, 很多时候一次使用到的就是其中的某一小部分的值, 例如10k大小, 某次使用到的可能就是10-1k这么小的局部.
for (int i = 0; i < 10000; ++i)
{
// change the value of 100 elements to [0, 1];
}
for (int i = 0; i < 10000; ++i)
{
if (value[i] > 0)
do ...
祈祷落幕时
书名:祈祷落幕时
作者:东野圭吾
2015-1
amazon.cn 12月份的推荐书, 尝试买回来看一下, 谁知一看就停不下来, 周五下午到周六就看完了. 极少看侦探推理小说啊,都忘了上一部是什么时候看的了. 主要是叙述看得很舒服, 没有太凶残的描写, 关键是找人物的联系.
介绍说是父女的爱, 但看过一半没有预知结局时候还是觉得很莫名, 跟父女的亲情有什么关系呢? 而题目为什么又是"祈祷落幕时"呢?
当看完之后回味, 才觉得这书名不错。推荐.
GPP - Double Buffer
首先多谢作者的慷慨generous!
http://gameprogrammingpatterns.com/double-buffer.html
Double buffer 出发点intent是使得一系列连续的操作像是同时立刻完成的。
为什么这么说呢?
作者的例子是读写屏幕的, 我画图说明:
问题是那个内存块还没有写完, 屏幕过来读的太快了, 我甚至猜想: 屏幕过来好几个笔头分任务读, 每个读一小块区域, 那速度就更快了, 快的结果是读到还没有来得及写的区域, 那可能那块区域里面就是一些不是这一帧原本想要呈现的信息(可能是之前的帧的遗留信息). 描述这样的现象专门有一个名词"tearing", or "image tearing".
解决方案,就是引入两个buffer, 你笔头2只能从我写完的那个bufferA里面读, 而另一个bufferB我笔头1在写, 没有写完之前不给笔头2来读. 等我笔头1写完了这个bufferB, 就做一个swap告诉笔头2可以来读这个bufferB了. 笔头2来读bufferB的时候, 我笔头1又过去写bufferA了, 依然没写完之前不给笔头2来读.....
[update 2014-12-18]在看以下新闻时候遇到了"image tearing"这个词. "A 4K monitor is great in theory, but ...
more ...LeetCodeOJ - Find Minimum in Rotated Sorted Array
题目:
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array
基本上看到sorted, find, ... 这关键字就想到binary search二分查找.
根据输入 ...
Reading List
C++ Concurrency in Action: Practical Multithreading Paperback – February 28, 2012
by Anthony Williams (Author)
Multithreading for Visual Effects Hardcover – July 29, 2014
Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14 Paperback – December 5, 2014
by Scott Meyers (Author)
Game Engine Architecture, Second ...
more ...LeetCodeOJ - Min Stack
Leetcode 上的题目, 实现一个Min Stack.
+ 带stack的一般功能, push, pop, top;
+ int getMin()能在constant time 返回最小值.
很明显, 带stack一般功能的容易实现, 用std::vector也行,or直接用std::stack<>这个container adapter更直接( 所谓adapter, 就是这个类型里面的实现会用到某些简单的container, 如vector, list).
但是那个getMin()呢?
假如只是取一个最小值, 那就简单了, 每次push时候都比较记录当前最小值就ok了. 但是假如不断地pop, 不断地getMin, 那stack内容改动了就需要不停地更新最小值.
一开始我想到保存一个最小值, 并可能需要O(n)的时间来更新这个最小值. 下面的方法是保存所有当前的最小值. 你只要取走了最小的, 然后下一个最小的立马出现了.
两个container, 其中一个是std::stack 用于实现一般的stack功能; 另一个可以是std::vector/list/stack ...
Algo - Tower of Hanoi
在书[Anany Levitin, 算法设计与分析基础]的第二章又看到汉诺塔的问题:
有三个柱子A B C; A柱上有好几个盘子, 小的放在大的上面;
现在问怎么把A柱上的盘子移到C柱上, B是做辅助的, 条件是大的盘子不能压到小的盘子上. 所以结果C柱上的盘子也是小的放在大的上面。
A,B,C; 三个柱子
假如A上有1个盘子,直接放到C上就解答完了。
假如A上有2个盘子ab,a盘小的 在 b盘大的上面. 先把a放到B上, b放到C上, 然后把a从B移到C上. 结果就是C柱上有ab。[pattern 1]
注意这种case中先把a放到C上, 那b放到B上, 然后a从C移到到B柱上, 那B柱上就有ab两个盘子了. 这结果很像上面的, 但是B柱跟C柱次序反了. 可见在移动盘子的时候, 柱子的次序, 是很重要的.
假如A上有3个盘子, 去尝试多画几次, 还是能解出来, 但是发现好像没有什么规律啊.
假如A上有4个盘子, 那可能就要尝试好多次才能碰巧一次解答出来. 还没有看出来规律.
要换一种角度来看啊, 上面我们已经解答了A柱上有2个盘子的case了. 那重新看A柱上有3个盘子的case.
A柱上的2个盘子 ...
more ...