我们正在为iPhone和Windows Phone 7开发一个项目,我们希望能够在杯子底部生成茶叶。它不必看起来像照片一样逼真的,实际上,卡通-没关系。
我们应该研究什么样的技术来做到这一点?是否有任何有用的库(最好是C语言,但我们可以翻译)?
这是从Google图片搜索中提取的一些示例
我们正在为iPhone和Windows Phone 7开发一个项目,我们希望能够在杯子底部生成茶叶。它不必看起来像照片一样逼真的,实际上,卡通-没关系。
我们应该研究什么样的技术来做到这一点?是否有任何有用的库(最好是C语言,但我们可以翻译)?
这是从Google图片搜索中提取的一些示例
Answers:
我应该怎么做,以便我可以保持一些美术控制,而不必花费很长时间尝试调整一种程序化方法以使其正确无误。
首先,手动创建许多茶花小精灵作为您的艺术“池”-并非每个都是茶杯的总价值,而是更像是一个较小的分组。说,其中20个左右?
然后将它们的随机数放在“杯子”底座上的随机坐标上。给每一个随机旋转和缩放,再加上随机的水平和/或垂直镜像。这应该产生良好的结果。
这种方法将为您提供艺术上的自由,使您可以创建单个的块以具有所需的外观,同时可以实现多种多样的结果(假设有足够的精灵可供选择)。
此外,借助此方法(以及任何基于Perlin噪声的随机方法),您实际上可以在过程开始时使用已知种子为随机数生成器提供种子,从而获得可重现的结果。如果保存种子,则可以在序列开始之前通过重新播种来再次完全重新创建相同的模式。您甚至可以做一些有趣的事情,例如让某人键入他们的名字,将字母转换为数字(ASCII总和等),然后将其用作“这种为您定制的茶叶模式”的种子。事情。
这是我的意思的一些伪代码,如果有帮助的话...
var sprites = [...]; // Array of tea leaf sprites
var n_leaves = rand(5)+5; // Random number of leaves from 5-9
for (i=0; i<n_leaves; i++) {
var sprite_index = rand(sprites.length); // Random sprite index
var r = rand(CUP_DIAMETER); // Random radius for point on disk calc
var theta = rand(2*PI); // Random theta (rotation) for point on disk
var sprite_x = sqrt(r) * cos(theta); // Sprite X
var sprite_y = sqrt(r) * sin(theta); // Sprite Y
var sprite_rotation = rand(2*PI); // Sprite rotation
var sprite_scale = rand(1) + 0.5; // Sprite scale from 0.5 to 1.5
var sprite_h_mirror = (rand(1) < 0.5 ? true : false); // If true, mirror horizontally
var sprite_v_mirror = (rand(1) < 0.5 ? true : false); // If true, mirror vertically
draw_sprite(sprite_index, sprite_x, sprite_y, sprite_rotation, sprite_h_mirror, sprite_v_mirror);
}
请访问http://mathworld.wolfram.com/DiskPointPicking.html,以获取有关如何在磁盘中选择随机点以及为什么要使用整个sqrt / sin / cos内容的精彩讨论。
尝试二进制截止值为0.8左右的佩林噪声吗?
将示例图片上传到http://imgur.com/a/Ydc4y。第一个是应用了阈值的第二个图像。第二个是基本的Perlin噪声,您可以找到许多很好的参考资料,例如http://en.wikipedia.org/wiki/Perlin_noise和http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter26.html。
您可以对Perlin噪声中的八度音阶和音阶进行一些调整,以改变输出的外观,并确定确定有多少(平均)的阈值。