forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Кватернион. Как определить угол вращения. (http://forum.boolean.name/showthread.php?t=18226)

moka 28.07.2013 06:04

Ответ: Кватернион. Как определить угол вращения.
 
По сути тебе нужно сделать матрицу, основанную на векторе между камерой и центром планеты. Затем просто множ матрицу поворота камеры на эту матрицу полученную ранее. Получиться что до перемножения будут коорданаты как ты сказал, а затем будет уже трансформированная - для визуализации и реальной позиции на планете.

dsd 30.08.2013 23:56

Ответ: Кватернион. Как определить угол вращения.
 

мой первый полуспертый cg шейдер :-D
по идее это солнце.

Код:

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"
}


pax 31.08.2013 11:50

Ответ: Кватернион. Как определить угол вращения.
 
Не уверен что тебе в данном случае нужен сурфейсный шейдер...
Посмотри в стандартных шейдерах Flare или Font шейдеры. http://unity3d.com/unity/download/archive

dsd 02.09.2013 00:29

Ответ: Кватернион. Как определить угол вращения.
 


еще одно солнце


Код:

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


Часовой пояс GMT +4, время: 12:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot