﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ASionix%2FSummerOfCode2006%2FSky</id>
	<title>利用者:Sionix/SummerOfCode2006/Sky - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ASionix%2FSummerOfCode2006%2FSky"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Sky&amp;action=history"/>
	<updated>2026-04-25T12:20:03Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Sky&amp;diff=47480&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Sky&amp;diff=47480&amp;oldid=prev"/>
		<updated>2018-06-28T17:47:48Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 17:47時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Sky&amp;diff=47479&amp;oldid=prev</id>
		<title>wiki&gt;Sionix: /* Sky */</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Sky&amp;diff=47479&amp;oldid=prev"/>
		<updated>2006-09-27T15:53:58Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Sky&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Sky =&lt;br /&gt;
[ [[User:Sionix/SummerOfCode2006|Back to the project]] ] [ http://sionix.pbwiki.com/SummerOfCode2006_Screenshots ]&lt;br /&gt;
&lt;br /&gt;
== How it works and User interface ==&lt;br /&gt;
&lt;br /&gt;
New mode 'Sky' is introduced into World buttons. And new floating window for setting Sky engine parameters:&lt;br /&gt;
&lt;br /&gt;
[[Image:Skygen_ui_world.PNG]]&lt;br /&gt;
&lt;br /&gt;
Lamp buttons are extended with 'Sun' window. It has controls to set lamp position via time and date properties:&lt;br /&gt;
&lt;br /&gt;
[[Image:Skygen_ui_sun.PNG]]&lt;br /&gt;
&lt;br /&gt;
Lamp also can be manually placed at any point of the scene, taking into account following rules:&lt;br /&gt;
&lt;br /&gt;
* Zenith, East and South are respectively +Z, +X, -Y&lt;br /&gt;
* Although sun lamp object has a position, Sky engine uses only spherical coordinates of it. Zero point is scene's (0, 0, 0). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage examples ==&lt;br /&gt;
&lt;br /&gt;
1. Activate World 'Sky' mode;&lt;br /&gt;
&lt;br /&gt;
2. Set position, time, date params. Air turbidity;&lt;br /&gt;
&lt;br /&gt;
3. Render scene - sky will be displayed.&lt;br /&gt;
&lt;br /&gt;
== Programming interface ==&lt;br /&gt;
There are two main interface instructions: '''SetupParams''' and '''GetRayColor'''. The first one is used for tuning Sky engine parameters and will be called from UI. The second is intended to be included into Render pipeline and returns the result of Sky engine's processing in given direction.&lt;br /&gt;
&lt;br /&gt;
=== Integration into pipeline ===&lt;br /&gt;
'''GetRayColor''' instruction will be placed into source/blender/render/intern/source/rendercode.c module, shadepixel_sky() function. This place is used now for applying current World blend functionality into render results. And is the most convenient for GetRayColor call. (open issue: cooperation with current sky model - possibly some switch in World structure)&lt;br /&gt;
&lt;br /&gt;
'''SetupParams''' will be placed into blender's UI module - source/blender/src/buttons_shading.c. And will be called each time when Sky UI updates World states.&lt;br /&gt;
&lt;br /&gt;
=== Objects and relations ===&lt;br /&gt;
==== Interface functions ====&lt;br /&gt;
Library C interface functions for using in other Blender modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void BSG_getRayColor(float *color, float *view_vec, Object *camera);&lt;br /&gt;
void BSG_setTurbidity(float turbidity);&lt;br /&gt;
void BSG_setDateTime(short month, short day, float hour);&lt;br /&gt;
void BSG_updateSceneObjects(struct Scene *scene);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BSG_getRayColor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[out] color Float buffer capable for holding 4 floats - RGBA values &lt;br /&gt;
   of Sky engine's result.&lt;br /&gt;
@param[in] view_vec 3D vector pointing rendering pixel in Camera space.&lt;br /&gt;
@param[in] camera Current camera object.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BSG_setTurbidity:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[in] turbidity Turbidity value (air pollution coefficient) [0; 64].&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BSG_setDateTime:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[in] month Date - month [0; 11].&lt;br /&gt;
@param[in] day Date - day [0; 31].&lt;br /&gt;
@param[in] hour Current time [0; 24].&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BSG_updateSceneObjects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[in] scene Pointer to scene.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Auxiliary mathematics ====&lt;br /&gt;
Classes for calculation optics equations, some auxiliary geometry functionality.&lt;br /&gt;
&lt;br /&gt;
Vector class, some extra functionality over vectors. Will be extended.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Vect3f&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	Vect3f();&lt;br /&gt;
	Vect3f(float x, float y, float z);&lt;br /&gt;
	Vect3f(const Vect3f &amp;amp;v);&lt;br /&gt;
&lt;br /&gt;
	// General vector operators&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	const Vect3f &amp;amp;Transform(float mat[][3]);&lt;br /&gt;
	float Normalize();&lt;br /&gt;
	inline float Length();&lt;br /&gt;
	inline float SqrLength();&lt;br /&gt;
&lt;br /&gt;
	inline operator float *();&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
	float data[3];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optics color and conversion. Sky modelling uses CIE 1931 color space (http://www.easyrgb.com/math.php?MATH=M15#text15) so it needs special conversion functionality to get RGB value.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class OptColor : public Vect3f&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	const OptColor &amp;amp;ConvertYxyToRGB();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Converting local time into sun position over horizon. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class SunTime&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	SunTime();&lt;br /&gt;
	SunTime(int day, float hour);&lt;br /&gt;
&lt;br /&gt;
	inline int Day();&lt;br /&gt;
	inline float Hour();&lt;br /&gt;
	inline void SetDay(int day);&lt;br /&gt;
	inline void SetHour(float hour);&lt;br /&gt;
&lt;br /&gt;
	void SetDate(int month, int month_day);&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	struct PositionProperties&lt;br /&gt;
	{&lt;br /&gt;
		float latitude;&lt;br /&gt;
		float longitude;&lt;br /&gt;
		float standart_meridian;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	void SetPositionProperties(const PositionProperties &amp;amp;prop);&lt;br /&gt;
	void SetDefaultProperties();&lt;br /&gt;
&lt;br /&gt;
	Vect3f GetSolarPosition();&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	PositionProperties m_properties;&lt;br /&gt;
	int m_day;&lt;br /&gt;
	float m_hour;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed functions' description:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/// Default constructor.&lt;br /&gt;
SunTime::SunTime()&lt;br /&gt;
&lt;br /&gt;
/// Constructor.&lt;br /&gt;
/// @param[in] day Day of the year in range [0; 365].&lt;br /&gt;
/// @param[in] hour Current local time [0; 24).&lt;br /&gt;
SunTime::SunTime(int day, float hour)&lt;br /&gt;
&lt;br /&gt;
/// Getters and setters for time and date.&lt;br /&gt;
int SunTime::Day()&lt;br /&gt;
float SunTime::Hour()&lt;br /&gt;
void SunTime::SetDay(int day)&lt;br /&gt;
void SunTime::SetHour(float hour)&lt;br /&gt;
&lt;br /&gt;
/// Calculate and set day using date info.&lt;br /&gt;
/// @param[in] month Month [0; 11].&lt;br /&gt;
/// @param[in] month_day Day of the month [0; 31].&lt;br /&gt;
void SunTime::SetDate(int month, int month_day)&lt;br /&gt;
&lt;br /&gt;
/// Setup observer's position.&lt;br /&gt;
/// @param[in] prop Position properties data.&lt;br /&gt;
void SunTime::SetPositionProperties(const PositionProperties &amp;amp;prop)&lt;br /&gt;
&lt;br /&gt;
/// Set default properties (coordinates of Minsk).&lt;br /&gt;
void SunTime::SetDefaultProperties()&lt;br /&gt;
&lt;br /&gt;
/// Calculate solar position.&lt;br /&gt;
/// @return Direction vector.&lt;br /&gt;
Vect3f SunTime::GetSolarPosition()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sky engine ====&lt;br /&gt;
Main class of the library. Incapsulates lib functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class SkyEngine &lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	SkyEngine();&lt;br /&gt;
&lt;br /&gt;
	// World params&lt;br /&gt;
	inline Vect3f &amp;amp;Zenith();&lt;br /&gt;
	inline Vect3f &amp;amp;South();&lt;br /&gt;
	inline SunTime &amp;amp;GetSunTime();&lt;br /&gt;
	inline float &amp;amp;Turbidity();&lt;br /&gt;
&lt;br /&gt;
	// Output value&lt;br /&gt;
	void GetRayColor(Vect3f &amp;amp;res, const Vect3f &amp;amp;ray);&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
	// Structure used in computation model&lt;br /&gt;
	struct PerezCoeffs&lt;br /&gt;
	{&lt;br /&gt;
		float A, B, C, D, E;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
	// Get value of Perez functional&lt;br /&gt;
	float PerezFunc(const PerezCoeffs &amp;amp;pc, float cos_theta, float gamma);&lt;br /&gt;
	// Calculate Perez coefficients using current turbidity&lt;br /&gt;
	void CalcCoeffs(PerezCoeffs &amp;amp;pcY, PerezCoeffs &amp;amp;pcx, PerezCoeffs &amp;amp;pcy);&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	// Direction vectors&lt;br /&gt;
	Vect3f m_zenith;&lt;br /&gt;
	Vect3f m_south;&lt;br /&gt;
&lt;br /&gt;
	// Sun location&lt;br /&gt;
	SunTime m_suntime;&lt;br /&gt;
	// Air pollution&lt;br /&gt;
	float m_turbidity;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed functions' description:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/// Default constructor.&lt;br /&gt;
SkyEngine::SkyEngine()&lt;br /&gt;
&lt;br /&gt;
/// Provide access to params.&lt;br /&gt;
Vect3f &amp;amp;SkyEngine::Zenith();&lt;br /&gt;
Vect3f &amp;amp;SkyEngine::South();&lt;br /&gt;
SunTime &amp;amp;SkyEngine::GetSunTime();&lt;br /&gt;
float &amp;amp;SkyEngine::Turbidity();&lt;br /&gt;
&lt;br /&gt;
/// Get sky color in given direction.&lt;br /&gt;
/// @param[out] res RGB color result.&lt;br /&gt;
/// @param[in] ray Ray vector from observer.&lt;br /&gt;
void SkyEngine::GetRayColor(Vect3f &amp;amp;res, const Vect3f &amp;amp;ray)&lt;br /&gt;
&lt;br /&gt;
// protected:&lt;br /&gt;
&lt;br /&gt;
/// Get value of Perez functional&lt;br /&gt;
/// @param[in] pc Input perez coefficients.&lt;br /&gt;
/// @param[in] cos_theta Cos of theta angle of sun position.&lt;br /&gt;
/// @param[in] gamma Gamma angle in radians of sun position.&lt;br /&gt;
/// @return Value of Perez functional.&lt;br /&gt;
float SkyEngine::PerezFunc(const PerezCoeffs &amp;amp;pc, float cos_theta, float gamma)&lt;br /&gt;
&lt;br /&gt;
/// Calculate Perez coefficients using current turbidity&lt;br /&gt;
/// @param[out] pcY Resulting coeffs for Y channel.&lt;br /&gt;
/// @param[out] pcx Resulting coeffs for x channel.&lt;br /&gt;
/// @param[out] pcy Resulting coeffs for y channel.&lt;br /&gt;
void SkyEngine::CalcCoeffs(PerezCoeffs &amp;amp;pcY, PerezCoeffs &amp;amp;pcx, PerezCoeffs &amp;amp;pcy)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== World changes ====&lt;br /&gt;
&lt;br /&gt;
Extension of World structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	/* sky engine */&lt;br /&gt;
	float turbidity;&lt;br /&gt;
	short sky_mode, add_angle;&lt;br /&gt;
	char sun_lamp_name[24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''turbidity''' - physical air pollution value&lt;br /&gt;
&lt;br /&gt;
'''sky_mode''' - switch for Natural/User color and OneSun&lt;br /&gt;
&lt;br /&gt;
'''add_angle''' - angle value in radians of horizon curvature&lt;br /&gt;
&lt;br /&gt;
'''sun_lamp_name''' - lamp object name while in OneSun mode&lt;br /&gt;
&lt;br /&gt;
New World sky type flags&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define WO_SKYSKY	32&lt;br /&gt;
&lt;br /&gt;
/* sky mode */&lt;br /&gt;
#define WO_SKY_NATURAL	1&lt;br /&gt;
#define WO_SKY_ONESUN	2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lamp changes ====&lt;br /&gt;
&lt;br /&gt;
Sun location is calculated by SkyEngine using local time and position.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define LA_USEDATE	32768&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Extension of Lamp structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	/* sky engine */&lt;br /&gt;
	short date_month, date_day;  &lt;br /&gt;
	float date_hour;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Folders structure ==&lt;br /&gt;
Folders structure is common for whole SkyGen project.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
soc-blender/&lt;br /&gt;
   projectfiles_vc7/&lt;br /&gt;
      blender/&lt;br /&gt;
         BSG_SkyGen/&lt;br /&gt;
            BSG_SkyGen.vcproj&lt;br /&gt;
   source/&lt;br /&gt;
      blender/&lt;br /&gt;
         BSG_SkyGen/&lt;br /&gt;
            BSG_SkyGen.h       // Interface header&lt;br /&gt;
            intern/&lt;br /&gt;
               BSG_SkyGen.cpp  // Interface functions implementation&lt;br /&gt;
&lt;br /&gt;
               // Common modules&lt;br /&gt;
               sky_math.h          // Auxiliary math&lt;br /&gt;
               sky_math.cpp &lt;br /&gt;
&lt;br /&gt;
               // Sky module&lt;br /&gt;
               SkyEngine.h     // Sky engine&lt;br /&gt;
               SkyEngine.cpp   // Sky engine&lt;br /&gt;
&lt;br /&gt;
               ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>wiki&gt;Sionix</name></author>
		
	</entry>
</feed>