|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
28.07.2013, 06:04
|
#16
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Кватернион. Как определить угол вращения.
По сути тебе нужно сделать матрицу, основанную на векторе между камерой и центром планеты. Затем просто множ матрицу поворота камеры на эту матрицу полученную ранее. Получиться что до перемножения будут коорданаты как ты сказал, а затем будет уже трансформированная - для визуализации и реальной позиции на планете.
|
(Offline)
|
|
30.08.2013, 23:56
|
#17
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Кватернион. Как определить угол вращения.
мой первый полуспертый cg шейдер
по идее это солнце.
Shader "Custom/Main Sequence Star" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
float3 mod(float3 uv, float res){
return uv - res * floor(uv/res);
}
float snoise(float3 uv, float res){
const float3 s = float3(1e0, 1e2, 1e4);
uv *= res;
float3 uv0 = floor(mod(uv, res))*s;
float3 uv1 = floor(mod(uv+float3(1.), res))*s;
float3 f = frac(uv); f = f*f*(3.0-2.0*f);
float4 v = float4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z, uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z);
float4 r = frac(sin(v*1e-3)*1e5);
float r0 = lerp(lerp(r.x, r.y, f.x), lerp(r.z, r.w, f.x), f.y);
r = frac(sin((v + uv1.z - uv0.z)*1e-3)*1e5);
float r1 = lerp(lerp(r.x, r.y, f.x), lerp(r.z, r.w, f.x), f.y);
return lerp(r0, r1, f.z)*2.-1.;
}
half4 corona(float2 uv){
float2 p = -0.5 + uv;
float color0 = 3.0 - (3.*length(2.*p));
float3 coord = float3(atan2(p.x,p.y)/6.2832+.5, length(p)*.4, .5);
for(int i = 1; i <= 7; i++)
{
float power = pow(2.0, float(i));
color0 += (1.5 / power) * snoise(coord + float3(0.,-_Time.y*.05, _Time.y*.01), power*16.);
}
return half4( color0, pow(max(color0,0.),2.)*0.4, pow(max(color0,0.),3.)*0.15 , 1.0);
}
void surf (Input IN, inout SurfaceOutput o) {
float2 texCoor = IN.uv_MainTex + float2(_Time.x,0);
half4 c = tex2D (_MainTex, texCoor);
float leng = length( float2(0.5,0.5) - IN.uv_MainTex);
half4 c0 = half4( c.x, pow(max(c.x,0.),2.)*0.4, pow(max(c.x,0.),3.)*0.15 , 1.0);
half4 c1 = half4( c.y, pow(max(c.y,0.),2.)*0.4, pow(max(c.y,0.),3.)*0.15 , 1.0);
half4 c2 = half4( c.z, pow(max(c.z,0.),2.)*0.4, pow(max(c.z,0.),3.)*0.15 , 1.0);
half4 c3 = half4( c.w, pow(max(c.w,0.),2.)*0.4, pow(max(c.w,0.),3.)*0.15 , 1.0);
//цвет от сферы солнца
o.Albedo = 3*(c0+c1+c2+c3);
o.Albedo *= 1-3.3333*leng;
//языки пламени по краям
half4 flames = corona(IN.uv_MainTex);
if(leng >= 0.25 && leng < 0.3){
//край солнца и протуберанцы нарастающие
float p = (0.3-leng)*20;
o.Albedo = lerp(flames,o.Albedo,p);
}
if(leng >= 0.3){
//корона
o.Albedo = flames;
}
}
ENDCG
}
FallBack "Self-Illumin/Diffuse"
}
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
31.08.2013, 11:50
|
#18
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Кватернион. Как определить угол вращения.
Не уверен что тебе в данном случае нужен сурфейсный шейдер...
Посмотри в стандартных шейдерах Flare или Font шейдеры. http://unity3d.com/unity/download/archive
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.09.2013, 00:29
|
#19
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Кватернион. Как определить угол вращения.
еще одно солнце
Shader "Custom/Sun3" {
Properties {
}
SubShader {
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
//Cull Off Lighting Off ZWrite Off Ztest Always Fog { Mode Off }
Blend One One
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma target 3.0
#include "UnityCG.cginc"
fixed4 _TintColor;
struct appdata_t {
half4 vertex : POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
};
struct v2f {
half4 vertex : POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
};
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.texcoord =v.texcoord;
return o;
}
half3 mod(half3 uv, half res){
return uv - res * floor(uv/res);
}
half snoise(half3 uv, half res){
const half3 s = half3(1e0, 1e2, 1e4);
uv *= res;
half3 uv0 = floor(mod(uv, res))*s;
half3 uv1 = floor(mod(uv+half3(1.), res))*s;
half3 f = frac(uv); f = f*f*(3.0-2.0*f);
half4 v = half4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z, uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z);
half4 r = frac(sin(v*1e-3)*1e5);
half r0 = lerp(lerp(r.x, r.y, f.x), lerp(r.z, r.w, f.x), f.y);
r = frac(sin((v + uv1.z - uv0.z)*1e-3)*1e5);
half r1 = lerp(lerp(r.x, r.y, f.x), lerp(r.z, r.w, f.x), f.y);
return lerp(r0, r1, f.z)*2.-1.;
}
fixed4 frag (v2f i) : COLOR
{
half radius = 0.24 ;
half invRadius = 1.0/radius;
half3 orange = half3( 0.8, 0.55, 0.2 );
half time = _Time.x;
half2 p = -0.5 + i.texcoord;
half fade = pow( length( 2.0 * p ), 0.5 );
half fVal1 = 1.0 - fade;
half fVal2 = 1.0 - fade;
half angle = atan2( p.x, p.y )/6.2832;
half dist = length(p);
half3 coord = half3( angle, dist, time * 0.1 );
half newTime1 = abs( snoise( coord + half3( 0.0, -time * ( 0.35 ), time * 0.015 ), 15.0 ) );
half newTime2 = abs( snoise( coord + half3( 0.0, -time * ( 0.15 ), time * 0.015 ), 45.0 ) );
half3 xCoord = half3( 0.0, -time, time * 0.2 ) + coord;
fVal1 += 0.125 * snoise( xCoord, ( 40 * newTime1 ) );
fVal2 += 0.125 * snoise( xCoord, ( 100 * (newTime1 +1.35) ) );
fVal1 += 0.05 * snoise( xCoord, ( 90 * newTime1 ) );
fVal2 += 0.05 * snoise( xCoord, ( 225 * (newTime1 +1.35) ) );
half corona = pow( fVal1 * max( 1.1 - fade, 0.0 ), 2.0 );
corona += pow( fVal2 * max( 1.1 - fade, 0.0 ), 2.0 );
corona *= 30*(2.0 - newTime1);
half sunColor = (0.6 + 0.4*snoise(4*half3(i.texcoord + half2(time*0.5,0),time*0.5),16));
half4 c = half4( sunColor, pow(max(sunColor,0.),2.), pow(max(sunColor,0.),3.), 1.0);
c.rgb *=orange;
if( dist < radius ){
corona *= pow( dist * invRadius, 24.0 );
float p = 5*(radius-dist)*invRadius;
c.rgb = lerp(0,c.rgb,p);
float starGlow = min( max( 1.0 - dist, 0.0 ), 1.0 );
c.rgb += starGlow * orange;
}else{c=0;}
if( dist > 1.3 * radius){
half d = 1.45 * radius - dist;
d *=invRadius*7.5;
corona = lerp(0,corona,d);
}
c.rgb = c.rgb + corona * orange;
return c;
}
ENDCG
}
}
}
кто нить наподобие этого в cg перевести пробовал?
https://www.shadertoy.com/view/4slGD4
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:51.
|