2012-04-13 22 views
6

Tworzę grę na iOS przy użyciu bibliotek cocos2d.Dodawanie kolorów (kolory) Razem jak farba (niebieski + żółty = zielony itp.)

Powiedzmy, że masz dwa obiekty, które mają dwie oddzielne kolory - zdefiniowane w RGB jako

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

chcę dodać niebieski i żółty do zielonego.

Aby to wszystko skomplikować, powiedzmy, że obiekt Niebieski jest większy niż obiekt Żółty (ze względu na argument, powiedzmy, że stosunek wynosi 2: 1), dodaję dwa razy więcej niebieskiego niż żółtego - jak obliczyć ten nowy (jasnozielony) kolor poprawnie.

Rozumiem LAB * Przestrzeń kolorów jest przydatny dla tego rodzaju „naturalnych kolorów” typu rzeczy, ale nie jestem pewien, jak go używać - szczególnie w kontekście Cocos2d obiektu, który (AFAIK) jest ograniczone do używanie RGB w jego schematach kolorystycznych.

Byłbym wdzięczny za praktyczną pomoc w implementacji tego. Dzięki stosy!

21/4 Aktualizacja: Tak więc w LAB * niebieski + żółty ≠ zielony (co ma sens, gdy widzisz they're at opposite ends of the same channel). To naprawdę trudny problem z dyskusją na temat SO. Wydaje się, że ostateczną odpowiedzią jest użycie metody Kubelka-Munk, której używa kawałek oprogramowania Open Source o nazwie Krita. Nigdzie nie mogę tego znaleźć (ani formuła, ani sam kod).

This question ma a link, który używa HSL do pracy w podobny sposób do malowania. Zamierzam spróbować sprawdzić, czy to działa, i zwrócę tu wynik.

W międzyczasie if anyone knows how to implement Kubelka-Munk lub gdzie mogę znaleźć kod, aby to zrobić, lub inne rozwiązanie, byłbym bardzo, bardzo podekscytowany!

+1

'Niebieski + Yellow' nie jest' Green', jakbyś się, że w przedszkolu. To, o co tak naprawdę chodzi, to prosty, substruktywny model kolorów, taki jak CMYK, gdzie '1 - Cyjan - Żółty ≈ Zielony' (z' Cyan ≈ Niebieski'). – leftaroundabout

Odpowiedz

2

Sprawdź formuły na tej stronie: http://www.easyrgb.com/index.php?X=MATH Robiłem podobne rzeczy, a można to osiągnąć, konwertując RGB-> XYZ-> Lab. Jednak obliczenia są dość kosztowne (jeśli robisz to dla wielu pikseli).

I zapomnieć o RGB matematyki, gdy próbuje mieszać kolory, jeśli chcesz uzyskać wyniki podobne do ludzkiego oka

+0

Więc objectA, objectB są kolorowe z RGB - przekonwertuj RGB na XYZ na LAB, dodaj dwa kolory razem, po czym ponownie je przekonwertuj do XYZ i RGB? – glenstorey

+0

Tak dokładnie, jak napisałem, wymaga to dużej ilości obliczeń (przeanalizowałem cały obraz piksel po pikselu), ale daje przyzwoite wyniki –

+0

Po dodaniu dwóch kolorów razem w przestrzeni LAB. Jak to zrobić poprawnie? Tylko L1 * 0,5 + L2 * 0,5, A1 * 0,5 + A2 * 0,5 i B1 * 0,5 + B2 * 0,5? – Christoffer

2

Myślę, że warto spróbować HSL przestrzeń kolorów. Podczas dodawania kolorów interpolujemy ich wartości Hue (nawet biorąc pod uwagę masy obiektów). Jeśli kolory są nasycone w 100%, wartości Luminancji i Nasycenia będą równe.

5

Nie ma modelu kolorów, w którym mieszanie niebieskiego z żółtym powoduje zielony kolor. Wypróbuj sam z gwaszem, jedyny sposób, w jaki działa to cyan i żółty. Dlatego powinieneś spróbować przełączyć z RGB na CMYK iz powrotem, jeśli potrzebujesz. Oto jak to zrobić

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

, a następnie w kodzie, wymieszać cyjan i żółty

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

Uruchamianie kodu przyniesie: RGB mix = (0.000000, 255.000000, 0.000000)

+0

Dzięki za kupę odpowiedzi, szczególnie za kod. Myślę, że to zadziała na żółty plus niebieski - ale nie wiem, czy zadziała w przypadku innej arytmetyki kolorów. Robiłem pewne badania na ten temat i odpowiadam tak: http://stackoverflow.com/a/398268/459116 sprawiają, że wygląda na to, że LAB jest najlepszym sposobem na przejście. – glenstorey

+0

Zrobiłem to z żółtymi i niebieskimi farbami modelowymi, gdzie niebieski był ciemnoniebieski, który nie był "zielonkawy" - zdecydowanie nie "cyjan", a wynik był zdecydowanie zielony. Takiej rzeczy nie zdarzyłoby się przy drukowaniu barwników, ale łatwo może się zdarzyć z farbami i czasami może się zdarzyć również z barwnikami. (zobacz moją odpowiedź po więcej informacji) – supercat

1

Barwniki nie działają w świecie rzeczywistym zupełnie jak sugerują modele o subtraktywnych kolorach.Barwniki stosowane do drukowania CYMK są dość zbliżone, ponieważ zostały sformułowane w tym celu, ale wiele barwników wytworzonych z naturalnie występujących substancji może zachowywać się nieco dziwnie. Trudność polega na tym, że podczas gdy białe światło jest postrzegane jako połączenie czerwieni, zieleni i niebieskiego, faktycznie składa się z wielu różnych długości fal - dosłownie "wszystkie kolory tęczy" - każda z nich pobudzi czerwień, zieleń, i niebieskie receptory w oku w różnych ilościach. Możliwe jest, że dwa kolory, które wydają się identyczne, w rzeczywistości zawierają różne kombinacje długości fal; podobnie dwa barwniki mogą wyglądać identycznie, gdy są oglądane w świetle białym, ale absorbują różne kombinacje długości fal. Takie barwniki mogą wyglądać identycznie, gdy są używane samodzielnie, ale mogą dać bardzo różne - pozorne wyniki w połączeniu z czymś innym.

Mimo że barwniki mogą czasami być trudne, farby są jeszcze gorsze. Farby zawierają cząstki odblaskowe, a część światła, które uderza w pomalowaną powierzchnię, zostanie odbita z powrotem przez pierwszą cząsteczkę, którą trafi; w związku z tym mieszają się jak dodatkowe kolory. Na przykład, jeśli farba zawiera 20% zielonych cząstek, wtedy znacząca ilość zielonego światła zostanie odbita, niezależnie od innych kolorów, jakie może zawierać. Z drugiej strony, część światła, które uderza w pomalowaną powierzchnię, odbija się i uderza w wiele cząstek. Jeśli którakolwiek z tych cząstek pochłonie foton o pewnym kolorze, foton ten nie zostanie odbity. W związku z tym farby zachowują się bardziej jak subtraktywne kolory. W praktyce farby zachowują się trochę jak kolory dodatkowe, nieco przypominające subtraktywne kolory, a czasem przypominają coś dziwnego i zwariowanego i zupełnie niepodobnego do żadnego z nich.

0

Faktycznie wydaje się, że konwersja RGB-> XYZ-> LAB robi exatly to samo co> RGB-LAB

Powiązane problemy