如何生成看起来像剩下的茶叶的纹理?


11

我们正在为iPhone和Windows Phone 7开发一个项目,我们希望能够在杯子底部生成茶叶。它不必看起来像照片一样逼真的,实际上,卡通-没关系。

我们应该研究什么样的技术来做到这一点?是否有任何有用的库(最好是C语言,但我们可以翻译)?

这是从Google图片搜索中提取的一些示例

在此处输入图片说明 在此处输入图片说明


您能否更具体地说明您的要求?他们是否需要每次都不同地旋转?因为如果没有动画或唯一性要求,我将不明白为什么不能仅将照片/绘图用作纹理。
phillipwei

@phillipwei是的,它们每次都必须有所不同,或者至少应有足够的差异,以至于不会感觉像库存照片或其他东西。
Jedidja'4

Answers:


15

我应该怎么做,以便我可以保持一些美术控制,而不必花费很长时间尝试调整一种程序化方法以使其正确无误。

首先,手动创建许多茶花小精灵作为您的艺术“池”-并非每个都是茶杯的总价值,而是更像是一个较小的分组。说,其中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内容的精彩讨论。


7

尝试二进制截止值为0.8左右的佩林噪声吗?

将示例图片上传到http://imgur.com/a/Ydc4y。第一个是应用了阈值的第二个图像。第二个是基本的Perlin噪声,您可以找到许多很好的参考资料,例如http://en.wikipedia.org/wiki/Perlin_noisehttp://http.developer.nvidia.com/GPUGems2/gpugems2_chapter26.html

您可以对Perlin噪声中的八度音阶和音阶进行一些调整,以改变输出的外观,并确定确定有多少(平均)的阈值。


3
通过一些链接和可能产生的结果的示例,这可能是一个更好的答案。
MichaelHouse

好主意,尽管可以使用静态图像,并且可以将圆形区域固定在像素着色器中,并且圆滑的边缘羽化而无需产生每个像素的Perlin噪声值(根据我的经验,这种方法有点慢)。
teodron'4

产生Perlin噪声本身有点沉重。但是,您可以使用预先计算的噪声纹理来实现此效果(以及其他许多效果)。您也可以使用该方法来预先计算一些。
dascandy 2012年

4
-1。看了很多茶叶,还有很多sum(1 / f)Perlin杂讯,我不能说它们看起来完全一样。Perlin噪声可能是正确的起点,但该目标不适用于通常的sum(1 / f)变量。

1
我同意Perlin噪声方法不切实际。为了验证这一点,我尝试从perlin噪点开始在photoshop中重新创建效果。这是结果。虽然我认为还可以,但问题在于我必须进行大量的调整。我真的想不出一种方法来重新创建所有程序上的调整,所以我赞成蒂姆·霍尔特(Tim Holt)建议的基于子画面的方法。
David Gouveia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.