2012-04-13 31 views
6

Estoy haciendo un juego para iOS usando las librerías cocos2d.Agregando colores (colores) juntos como Paint (azul + amarillo = verde, etc.)

Digamos que tiene dos objetos que tienen dos colores diferentes - definidos en RGB como

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

Quiero añadir azul y amarillo para hacer verde.

Para complicar las cosas, digamos que el objeto azul es más grande que el objeto amarillo (por razones de argumento digamos que la relación es 2: 1), estoy agregando el doble de azul que amarillo - cómo para calcular este nuevo color (verde claro) correctamente.

Entiendo que LAB * Color Space es útil para este tipo de cosas de "color natural", pero no estoy seguro de cómo usarlo, especialmente en el contexto de un objeto cocos2d que (AFAIK) está limitado a usando RGB en sus esquemas de color.

Realmente agradecería ayuda práctica sobre cómo implementar esto. ¡Montones de gracias!

21/4 Actualización: En LAB * azul + amarillo ≠ verde (lo que tiene sentido cuando ve they're at opposite ends of the same channel). En realidad, es un problema bastante complicado con un littlebit de discusión sobre SO. Parece que la respuesta final es usar el método Kubelka-Munk que usa una pieza de software de código abierto llamada Krita. No puedo encontrar eso en ninguna parte (ni la fórmula ni el código en sí).

This question tiene a link que utiliza HSL para trabajar en un método similar para pintar. Voy a tratar de ver si funciona, y retrocederé el resultado aquí.

Mientras tanto if anyone knows how to implement Kubelka-Munk o donde puedo encontrar el código para hacer esto, u otra solución, ¡estaría muy, muy feliz!

+1

'Azul + Yellow' no es' Green', aunque se entera de que en el preescolar. A lo que se refiere en realidad es a un modelo de color sustractivo simple como CMYK, donde '1 - Cyan - Amarillo ≈ Verde '(con' Cian ≈ Azul '). – leftaroundabout

Respuesta

2

Revise las fórmulas en este sitio: http://www.easyrgb.com/index.php?X=MATH He estado haciendo algo similar, y se puede lograr mediante la conversión de RGB-> XYZ-> Lab. Sin embargo, el cálculo es bastante caro (si lo haces para muchos píxeles).

Y olvidarse de RGB matemáticas cuando se trata de mezclar los colores si desea obtener resultados similares al ojo humano

+0

Entonces objectA, objectB están coloreados con RGB - convierta el RGB a XYZ y luego a LAB, agregue los dos colores juntos, luego conviértelos nuevamente a XYZ y RGB? – glenstorey

+0

Sí exactamente, como escribí, requiere una gran cantidad de cálculos (analicé toda la imagen píxel por píxel) pero arroja resultados decentes –

+0

Cuando agrega los dos colores juntos en el espacio LAB. ¿Cómo se hace eso correctamente? Sólo L1 * 0.5 + L2 * 0.5, A1 * 0.5 + A2 * 0.5 y B1 * 0.5 + B2 * 0.5? – Christoffer

2

creo, vale la pena probar espacio de color HSL. Al agregar colores, interpolamos sus valores Hue (incluso teniendo en cuenta los pesos de los objetos). Si los colores están 100% saturados, los valores de Luminancia y Saturación serán iguales.

5

No existe un modelo de color en el que mezclar azul y amarillo sea verde. Inténtalo tú mismo con gouache, la única forma en que funciona es cian y amarillo. Es por eso que debe intentar cambiar de RGB a CMYK, y volver si es necesario. Aquí es cómo se hace

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); 
} 

Y luego, en su código, mezclar el cian y amarillo

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]); 

ejecutar el código producirá: RGB mix = (0.000000, 255.000000, 0.000000)

+0

Muchas gracias por su respuesta, especialmente por el código. Creo que esto funcionará para amarillo más azul, pero no sé si funcionará para otras aritméticas de color. He estado investigando sobre esto, y las respuestas como esta: http://stackoverflow.com/a/398268/459116 hacen que parezca que LAB es la mejor manera de hacerlo. – glenstorey

+0

Lo hice con pinturas modelo amarillas y azules, donde el azul era de un azul profundo que no era "verdoso", definitivamente no "cian", y el resultado era definitivamente verde. Tal cosa no sucedería con los tintes de impresión, pero puede suceder fácilmente con las pinturas y, a veces, también puede ocurrir con los tintes. (mira mi respuesta para más información) – supercat

1

Colorantes no funcionan en el mundo real como sugieren los modelos de color sustractivo.Los tintes utilizados para la impresión CYMK son bastante parecidos, ya que están formulados para ese propósito, pero muchos colorantes hechos a partir de sustancias naturales pueden comportarse de forma extraña. La dificultad es que, si bien la luz blanca se percibe como una combinación de rojo, verde y azul, en realidad consiste en muchas longitudes de onda diferentes, literalmente "todos los colores del arco iris", cada una de las cuales estimulará el rojo, el verde, y receptores azules en el ojo por diferentes cantidades. Es posible que dos colores que parecen idénticos contengan de hecho combinaciones diferentes de longitudes de onda; Del mismo modo, dos tintes pueden parecer idénticos cuando se ven con luz blanca, pero absorben diferentes combinaciones de longitudes de onda. Dichos colorantes pueden parecer idénticos entre sí cuando se usan solos, pero pueden producir resultados muy diferentes cuando se combinan con otra cosa.

Aunque los tintes a veces pueden ser complicados, sin embargo, las pinturas son incluso peores. Las pinturas contienen partículas reflectantes, y parte de la luz que golpea una superficie pintada se reflejará en la superficie de la primera partícula que golpee; en ese sentido, se mezclan como colores aditivos. Por ejemplo, si la pintura contiene un 20% de partículas verdes, se reflejará una cantidad significativa de luz verde, independientemente de otros colores que pueda contener. Por otro lado, parte de la luz que golpea una superficie pintada rebota y golpea múltiples partículas. Si alguna de esas partículas absorbe un fotón de algún color, ese fotón no se reflejará. En ese sentido, las pinturas se comportan más como colores sustractivos. En la práctica, las pinturas se comportan de manera similar a los colores aditivos, algo así como colores sustractivos, y a veces como algo raro y loco y totalmente diferente a cualquiera de los dos.

0

En realidad parece que la conversión de RGB-> xyz-> LAB hace exatly lo mismo que RGB-> LAB