2017-12-30 41 views
1

Ich habe dieses wunderbare Bild unten aus der Wikipedia page on Dodecahedrons. Es zeigt ein langsam rotierendes Tetroid. Wenn Sie genau hinschauen, ist klar, dass die Annahme besteht, dass irgendwo außerhalb des Bildschirms eine Lichtquelle ist. Wenn ein Gesicht mehr Licht zurück zum Betrachter reflektiert, erscheint es heller und wenn es weniger Licht reflektiert, erscheint es dunkler. Ich habe eine Vorstellung davon, wie ich eine Metrik für die Lichtmenge erhalten könnte, die ein Gesicht bei einer bestimmten Drehung reflektiert. Ich kann die Metrik auch auf einen Wert zwischen 0 und 255 skalieren (was die meisten Farbskalen annehmen). Wie bekomme ich jedoch die tatsächlichen RGB-Werte, die bei hoher Metrik wie ein helles, reflektierendes Blau und bei niedriger Metrik als dunkles Blau aussehen?Wie bekomme ich eine Farbskala für reflektiertes Licht

enter image description here

+1

Um zu erfahren, wie Sie die Helligkeit Berechnungen zu tun, einen Blick auf [Specular Highlight] nehmen (https://en.wikipedia.org/wiki/Specular_highlight). Um den tatsächlichen RGB-Wert zu erhalten, können Sie die HSV- oder HLS-Farbparametrisierung verwenden und mit den Funktionen im Standard ['colorsys'] in RGB umwandeln (https://docs.python.org/3/library/colorsys.html). Modul. –

+1

Ich nehme an, Sie möchten 3D-Rendering von Grund auf neu erstellen. Es ist jedoch viel einfacher, eine vorhandene 3D-Engine zu verwenden. Ich schlage vor, dass Sie sich [POV-Ray] (http://www.povray.org/) ansehen. –

+0

@ PM2Ring die HSL-Lösung ist genau das, was ich brauchte. Sie sollten das als Antwort hinzufügen. –

Antwort

1

Ich schlage vor, dass Sie den Standard colorsys Modul für diese Aufgabe, und die Arbeit im HSV verwenden oder HLS-Farbkoordinatensysteme. In der Regel bestimmen Sie den Farbton und die Sättigung Ihrer Grundfarbe und variieren dann den Wert oder die Helligkeit, um den gewünschten Farbbereich zu erstellen.

Hier ist ein kurzes Beispiel, das Numpy verwendet, um ein HLS-Raster aus einem bestimmten Farbton zu erstellen.

from colorsys import hls_to_rgb 
import numpy as np 
from PIL import Image 

def ls_grid(hue, numcolors, scale): 
    a = np.linspace(0, 1, num=numcolors, endpoint=True) 
    grid = np.array([[hls_to_rgb(hue, lite, sat) for sat in a] for lite in a]) 
    grid = (0.5 + 255 * grid).astype(np.uint8) 
    return grid.repeat(scale, axis=1).repeat(scale, axis=0) 

hue = 0.585 
numcolors, scale = 32, 16 
grid = ls_grid(hue, numcolors, scale) 
img = Image.fromarray(grid) 
img.show() 
img.save('litesat.png') 

lightness-saturation grid

+0

Sehr hilfreich! –

1

beginnt mit hohen RGB-Werten und reduziert R und G zunehmend dunkleren Blauton zu erhalten. Die folgende Bild wird auf diesem RGB-Werten basiert (R und G in Schritten von 20 reduziert werden):

230 230 250 
210 210 250 
190 190 250 
170 170 250 
150 150 250 

enter image description here