美文网首页
加法混合

加法混合

作者: 大龙10 | 来源:发表于2022-05-18 05:12 被阅读0次

书名:代码本色:用编程模拟自然系统
作者: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、运行结果

相关文章

  • 加法混合

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

  • 为什么混合运算要先乘除后加减?

    加法、减法、乘法、除法统称为四则混合运算。加法、减法在代数中表示比较简单,低级的运算,所以加减混合为一级运算...

  • PS 色彩原理

    屏幕上显示的光:就是RGB模式 加法的混合 (颜色的三原色) 印刷品上的的光:就是CMYK模式 减法的混合 ()

  • 第二节、图像预处理

    一、三种颜色空间 “加法混色”的含义:越混合越亮。 “减法混色”的含义:越混合越暗。 圆锥形代表了HSV颜色空间的...

  • 和孩子一起学奥数之“速算与巧算二”

    速算与巧算(二)加减乘混合 准备性知识 乘法 乘法(英语:Multiplication):加法的连续运算,同一数的...

  • 遇见那片海,青岛

    01 人的记忆并不是一种加法,它是意义不明确的各种可能性的混合。 对于青岛的向往,要追...

  • 时间序列3 非平稳序列分析

    1. 序列分解,因素分解 趋势,季节,交易日,随机波动加法模型减法模型混合模型式中,为长期趋势,为季节趋势,为噪声...

  • 02数量技巧——奇偶特性

    奇数:不能被2整除 偶数:能被2整除 使用范围: 整数的加法、减法、乘法以及它们的混合计算 基本原理: 加减法计算...

  • 今日所学(数学)

    今天,我们开始学习二年级的新知识啦! 数学课上,我们学习了加减混合运算,一年级的时候我们学过加法,...

  • Leetcode.371.Sum of Two Integers

    题目 不用加法计算加法。 思路 不使用加法就只能使用位运算。需要考虑负数的加法,减法和加法应该一样,采用取反加1的...

网友评论

      本文标题:加法混合

      本文链接:https://www.haomeiwen.com/subject/fxpsurtx.html