热点新闻
加法混合
2023-07-14 00:08  浏览:1785  搜索引擎搜索“混灰机械网”
温馨提示:信息一旦丢失不一定找得到,请务必收藏信息以备急用!本站所有信息均是注册会员发布如遇到侵权请联系文章中的联系方式或客服删除!
联系我时,请说明是在混灰机械网看到的信息,谢谢。
展会发布 展会网站大全 报名观展合作 软文发布

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

4.13 图像纹理和加法混合

1、加法混合

  • 计算机图形学有很多颜色混合算法,这些算法通常称作“混合(blend)模式”。

  • 在Processing中,如果在一幅图像之上绘制另一幅图像,默认显示最上层图像——这通常称为“常规”混合模式。

  • 如果图像有一定的透明度(就像模拟烟效程序中用到的图像),Processing会使用alpha透明度混合算法将一定比例的背景像素和前景像素结合起来,混合比例根据alpha值确定。

  • 除此之外,我们还可以使用其他混合模式,对粒子系统来说,有一种混合模式非常适
    用,它就是“加法(additive)模式”。
    Processing中的加法混合模式是由Robert Hodgin开发的,他在粒子系统和力的模拟上很有建树。他开发了Magnetosphere,后来成为iTunes的可视化效果。

  • 实际上,加法混合是最简单的混合算法之一,它只是将两个图层的像素值相加(当然,相加结果的最大值是255),最后形成的效果就是:随着图层增多,色彩变得越来越亮。

  • 为了在Processing中使用加法混合,你需要使用P2D或者P3D渲染器。

2、示例

示例代码4-9 加法混合

ParticleSystem ps; PImage img; void setup() { size(640, 360, P2D); // Create an alpha masked image to be applied as the particle's texture img = loadImage("texture.png"); ps = new ParticleSystem(0, new PVector(width/2, 50)); } void draw() { // Additive blending! blendMode(ADD); background(0); ps.run(); for (int i = 0; i < 10; i++) { ps.addParticle(); } }

Particle.pde

class Particle { PVector pos; PVector vel; PVector acc; float lifespan; // Another constructor (the one we are using here) Particle(PVector l) { // Boring example with constant acceleration acc = new PVector(0,0.05,0); vel = new PVector(random(-1,1),random(-1,0),0); vel.mult(2); pos = l.copy(); lifespan = 255; } void run() { update(); render(); } // Method to update position void update() { vel.add(acc); pos.add(vel); lifespan -= 2.0; } // Method to display void render() { imageMode(CENTER); tint(lifespan); image(img,pos.x,pos.y); } // Is the particle still useful? boolean isDead() { if (lifespan <= 0.0) { return true; } else { return false; } } }

ParticleSystem.pde

class ParticleSystem { ArrayList<Particle> particles; // An arraylist for all the particles PVector origin; // An origin point for where particles are birthed PImage tex; ParticleSystem(int num, PVector v) { particles = new ArrayList(); // Initialize the arraylist origin = v.get(); // Store the origin point for (int i = 0; i < num; i++) { particles.add(new Particle(origin)); // Add "num" amount of particles to the arraylist } } void run() { for (int i = particles.size()-1; i >= 0; i--) { Particle p = particles.get(i); p.run(); if (p.isDead()) { particles.remove(i); } } } void addParticle() { particles.add(new Particle(origin)); } void addParticle(Particle p) { particles.add(p); } // A method to test if the particle system still has particles boolean dead() { if (particles.isEmpty()) { return true; } else { return false; } } }

3、运行结果






发布人:be7c****    IP:61.145.99.***     举报/删稿
展会推荐
让朕来说2句
评论
收藏
点赞
转发