2017-12-30 67 views
1

Wikipedia page on Dodecahedronsからこの素晴らしい画像を得ました。これは、テトロイドがゆっくりと回転することを示しています。注意深く見ると、画面の外側のどこかに光源があることが前提であることは明らかです。顔がより多くの光を観察者に反射する場合、顔はより明るく見え、逆光が少ない場合はより暗く見える。私は、顔がある回転で戻ってきたときの光の量のメトリックをどのように得ることができるかについて考えています。また、メトリックを0から255の間の値にスケーリングすることもできます(ほとんどのカラースケールが想定しています)。ただし、メトリックが高い場合は明るく反射的な青色、メトリックが低い場合は暗い青色のように見える実際のRGB値を取得するにはどうすればよいですか?反射光を表すカラースケールを取得する方法

enter image description here

+1

[スペキュラハイライト](https://en.wikipedia.org/wiki/Specular_highlight)を見て、明るさの計算を行う方法を学習します。実際のRGB値を取得するには、標準の['colorsys'](https://docs.python.org/3/library/colorsys.html)の関数を使用して、HSVまたはHLSカラーパラメータを使用してRGBに変換します。モジュール。 –

+1

3Dレンダリングを最初からやりたいと思っています。ただし、既存の3Dエンジンを使用する方がずっと簡単です。私は[POV-Ray](http://www.povray.org/)を見てみることをお勧めします。 –

+0

@ PM2Ring HSLソリューションは私が必要としていたものです。それを答えとして追加する必要があります。 –

答えて

1

私はあなたがこの作業のための標準的なcolorsysモジュールを使用することを示唆している、とHSVでの作業またはHLSカラー座標系を使用します。典型的には、ベースカラーの色相と彩度を決定し、次に値または明度を変えて、必要な色合いの範囲を作成します。

Numpyを使用して特定の色相からHLSグリッドを作成する簡単な例を以下に示します。

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

非常に役に立ちます! –

1

スタート高いRGB値を持つ青の暗い色相を得るために徐々にR及びGを減少させます。次の図は、これらのRGB値(RとGは、20のステップで減少している)に基づいています。

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

enter image description here