6

cocos2d ライブラリを使用して iOS ゲームを作成しています。

RGB で次のように定義された、2 つの異なる色を持つ 2 つのオブジェクトがあるとします。

Blue:    0,0,255
Yellow:  255,255,0

青と黄を足して緑にしたい。

さらに複雑にするために、Blue オブジェクトが Yellow オブジェクトよりも大きいとしましょう (議論のために、比率は 2:1 であるとしましょう)。ここでは、黄色の 2 倍の青を追加しています。これを計算する方法新しい(薄緑)の色を正しく。

LAB *カラースペースはこの種の「自然な色」の種類に役立つことは理解していますが、特に(AFAIK)cocos2dオブジェクトのコンテキストでは、RGBの使用に制限されているため、その使用方法がわかりません配色。

これを実装する方法についての実用的なヘルプをいただければ幸いです。ありがとうございます!

21/4 更新: LAB* では、青 + 黄 ≠ 緑 (同じチャネルの反対側にあることがわかると、これは理にかなっています)。これは、実際には、SO について少し議論すると非常にトリッキーな問題 です。究極の答えは、Krita というオープン ソース ソフトウェアが使用する Kubelka-Munk メソッドを使用することのようです。どこにも見つかりません(数式またはコード自体)。

This questionには、 HSLを使用して同様の方法でペイントするリンクがあります。うまくいくか試してみますので、ここで結果をフィードバックします。

それまでの間、 Kubelka-Munk の実装方法や、これを行うためのコード、または別の解決策を見つけられる場所を誰かが知っていれば、私は非常に興奮します!

4

5 に答える 5

6

青と黄色を混ぜると緑になるカラーモデルはありません。ガッシュで自分で試してみてください。それが機能する唯一の方法はシアンと黄色です。これが、RGBからCMYKに切り替えて、必要に応じて元に戻す必要がある理由です。これがその方法です

void toCMYK(float red, float green, float blue, float* cmyk)
{
  float k = MIN(255-red,MIN(255-green,255-blue));
  float c = 255*(255-red-k)/(255-k); 
  float m = 255*(255-green-k)/(255-k); 
  float y = 255*(255-blue-k)/(255-k); 

  cmyk[0] = c;
  cmyk[1] = m;
  cmyk[2] = y;
  cmyk[3] = k;
}

void toRGB(float c, float m, float y, float k, float *rgb)
{
  rgb[0] = -((c * (255-k)) / 255 + k - 255);
  rgb[1] = -((m * (255-k)) / 255 + k - 255);
  rgb[2] = -((y * (255-k)) / 255 + k - 255);
}

次に、コードでシアンと黄色を混ぜます

float cmyk1[4];
toCMYK(255, 255, 0, cmyk1);  // yellow

float cmyk2[4];
toCMYK(0, 255, 255, cmyk2);  // cyan

// Mixing colors is as simple as adding
float cmykMix[] = { cmyk1[0] + cmyk2[0], cmyk1[1] + cmyk2[1], cmyk1[2] + cmyk2[2], cmyk1[3] + cmyk2[3] };

float rgb[3];
toRGB(cmykMix[0], cmykMix[1], cmykMix[2], cmykMix[3], rgb);  

NSLog(@"RGB mix = (%f, %f, %f)", rgb[0], rgb[1], rgb[2]);

コードを実行すると、次のようになります。RGB mix = (0.000000, 255.000000, 0.000000)

于 2012-04-13T14:33:20.113 に答える
2

HSL色空間を試す価値はあると思います。色を追加するとき、それらの色相値を補間します (オブジェクトの重みを考慮しても)。色の彩度が 100% の場合、輝度と彩度の値は等しくなります。

于 2012-04-13T13:22:16.530 に答える
2

このサイトの数式を確認してください: http://www.easyrgb.com/index.php?X=MATH 私は同様のことを行ってきましたが、RGB->XYZ->Lab を変換することで実現できます。ただし、計算は非常に高価です(多くのピクセルに対して実行する場合)。

また、人間の目に似た結果を得たい場合は、色を混合しようとするときに RGB の計算を忘れてください。

于 2012-04-13T11:47:48.757 に答える
1

染料は、減法混色モデルが示唆するように、現実の世界では機能しません。CYMK印刷に使用される染料は、その目的のために配合されているため、かなり近いですが、天然に存在する物質から作られた多くの染料は、やや奇妙な動作をする可能性があります。難しいのは、白色光は赤、緑、青の組み合わせとして認識されますが、実際には多くの異なる波長(文字通り「虹のすべての色」)で構成されており、それぞれが赤、緑、さまざまな量の目の青い受容体。実際に同一に見える2つの色には、異なる波長の組み合わせが含まれている可能性があります。同様に、2つの染料は、白色光で見ると同じように見えるかもしれませんが、波長の異なる組み合わせを吸収します。このような染料は、単独で使用した場合、互いに同一に見える場合があります。

染料は時々トリッキーになることがありますが、ペイントはさらに悪いです。ペイントには反射粒子が含まれており、ペイントされた表面に当たる光の一部は、最初に当たった粒子によって表面に反射して戻ります。その点で、それらは加法色のように混ざります。たとえば、ペイントに20%の緑色の粒子が含まれている場合、他の色に関係なく、かなりの量の緑色の光が反射されます。一方、ペイントされた表面に当たる光の一部は、跳ね返って複数のパーティクルに当たるでしょう。これらの粒子のいずれかが何らかの色の光子を吸収する場合、その光子は反射されません。その点で、塗料は減法混色のように振る舞います。実際には、塗料は加法混色のように、減法混色のように振る舞います。

于 2012-06-11T22:28:19.240 に答える