UnityのRigidbodyのVelocityとForceModeについて

一々忘れるので備忘録的に書いとく。

UnityのRigidBodyのVelocityはmassに左右されない。
つまりエネルギーではなく速度そのもの。
Velocityが0,0,1ならmassの値にかかわらずスピードは1。

ForceModeはForceだと力の値そのままが力として加えられる。
例えばmassが2のものに-Physics.gravityをAddForceしても落ちていく。
落としたくなければ
Rigidbody rb=GetComponent();
rb.AddForce(-Physics.gravity*rb.mass,ForceMode.Force);
とかやる必要がある。
ForceMode.Acceralationなら-Physics.gravityだけでいい。

追記160625
Unity5でも変わっていないのを確認している。

maxScriptで法線をコピー

メモ。
同じジオメトリでEdit_Normalモディファイアが既についてるという条件付で。

FloaterAddres = newRolloutFloater "法線をコピー" 130 180;
motoObj
sakiObj

motoMod
sakiMod

rollout normalCopy "法線コピー"
(
	Group "コピー元"
	(
		pickbutton motoPick "元をピック" width:100
	)
	Group "コピー先"
	(
		pickbutton sakiPick "先をピック" width:100
	)
	button exCopy "コピー"width:100
	
	on motoPick picked obj do
	(
		try
		motoMod=obj.modifiers[#Edit_Normals]
		catch
		(
			messageBox "don't exist Edit_Normals Modifier"
		)
		motoMod=obj.modifiers[#Edit_Normals];
		motoObj=obj
		motoPick.text=obj.name
		
	)
	
		on sakiPick picked obj2 do
	(
		try
		sakiMod=obj2.modifiers[#Edit_Normals]
		catch
		(
			messageBox "don't exist Edit_Normals Modifier"
		)
		sakiMod=obj2.modifiers[#Edit_Normals];
		sakiObj=obj2;
		sakiPick.text=obj2.name
		
	)
	
	on exCopy pressed do
	(
		normal=#();
		print motoObj
		motoMod=motoObj.modifiers[#Edit_Normals];
		sakiMod=sakiObj.modifiers[#Edit_Normals];
		i=motoMod.getNumNormals();
--		i=10;
		print motoMod;
		select motoObj
		for j=1 to i do(
			append normal (motoMod.GetNormal j);
		)
		select sakiObj
		for j=1 to i do(
			sakiMod.SetNormalExplicit j;
			sakiMod.SetNormal j normal[j]			
		)
	)
)
addRollout normalCopy FloaterAddres;

UnityのToonLightedシェーダーで影色を変更できるようにする。

http://simiss.at.webry.info/201304/article_1.html
を参考にさせていただいてToonLightedを改造。

Shader "Toon/LightedShadows" {
	Properties {
		_Color ("Main Color", Color) = (0.5,0.5,0.5,1)
		_ShadowColor("Shadow Color",Color)=(0.5,0.5,0.5,1)
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_Ramp ("Toon Ramp (RGB)", 2D) = "gray" {} 
	}

	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
CGPROGRAM
#pragma surface surf ToonRampShadow

sampler2D _Ramp;

// custom lighting function that uses a texture ramp based
// on angle between light direction and normal
#pragma lighting ToonRampShadow exclude_path:prepass
float4 _ShadowColor;
inline half4 LightingToonRampShadow (SurfaceOutput s, half3 lightDir, half atten)
{
	#ifndef USING_DIRECTIONAL_LIGHT
	lightDir = normalize(lightDir);
	#endif
	
	half d = dot (s.Normal, lightDir)*0.5 + 0.5;
	half3 ramp = tex2D (_Ramp, float2(d,d)).rgb;
	
	half4 c;
	c.rgb = s.Albedo * _LightColor0.rgb * ramp ;
	c.rgb*= d * min((atten + _ShadowColor.rgb), 1); 

	c.a = 0;
	return c;
}

sampler2D _MainTex;
float4 _Color;

struct Input {
	float2 uv_MainTex : TEXCOORD0;
};



void surf (Input IN, inout SurfaceOutput o) {
	half4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
	o.Albedo = c.rgb;
	o.Alpha = c.a;
}
ENDCG

	} 

	Fallback "Diffuse"
}

一応書いとく

http://anond.hatelabo.jp/20130617203056

これの元記事になってる話に関しての感想は割りと僕も似通った見方をしてて多分規制論者的にはhitoubanさんがその記事のブコメで書いてるような流れにしかならんよなとは思ったんだけどまぁそれはともかくとしてこの説は初めて聞くって話は児童ポルノは子どもという属性に対する差別だから、ってあたりでポルノ自体がそもそも差別的言論だからって話は元増田も書いているがレイプレイ事件の時に散々言われてた話なのでわかるんだけどその文脈からそのまま、"「チャイルドポルノ=子供という属性へのヘイト・スピーチ」と考えている人が多数いる"から"アメリカではチャイルドポルノは「保護されない表現」と定義される"って話につなげてきちゃうあたりねw

アメリカの表現の自由保護は表現内容規制については非常に厳しくとる、が、そもそも表現の価値にはグレードがあり児童ポルノ表現はそのような厳格に保護された表現の自由の自由の範疇に含まれないものであるから(だからと言って何の制約もなく規制できるわけではないにせよ)規制が可能である、という理屈になっているはずで(まぁこの辺詳しい人ならそれぞれの細々としたルールが決定されてく過程について○○vsState○○判決、そこで出された○○基準、とかその内容がすらすらでてくるんだろうけどw)理由としては反差別としてのヘイトスピーチだから、という話ではない、筈なのではないかなぁ、ということ。


まぁこの話はいかにも色んなものが入り組んでてあれなんだけどね。ペドファイル精神障害の一種として認識されてるのかもしれないけどそれで処罰って話になると病気だから処罰?障害者だから排除?それなんて差別?wって感じだし一般的にペドフィリアは思春期前の子どもへの性的衝動をもった人間らしいけど実際に制定されたり検討されたりしてる法制は18歳未満だったりするしいやそもそもペドファイルとチャイルドマレスターは違うし重なりも案外多くないとかでも表現による価値観の再生産を防ごうという話ならその標的はやっぱりチャイルドマレスターじゃないよなとか私的なことと公的なことを分離せずすべてが公的なものとして人権思想に沿って政治的に正しくあらねばならないとすればそれはまさに人権が国家ではなく個人を、しかも国家を縛り付けるものと同じ強度で縛り付ける鎖として機能する世界になる訳でそこには自由など存在する余地あんの?wとかねw


実際フェミニズム方面でマッキノンの話をいまさらそのまま引いてくるのか?みたいな話はレイプレイ事件の頃にあった気がするけどフェミニズム方面には詳しくないのでなんともいえないんだがしかしあれからもう4年くらい経つのにその頃の話がそのまま出てきたりするんだよなぁってあたりフランス革命から共和制がそれなりに安定したものとして成立した第三共和制まで90年とかかかってるんだしと思うべきなのか視聴者が入れ替わって戦隊モノが30年以上続くように論者が入れ替わって何週目だコレみたいなモノとしてみるべきなのかって感じはあるかなw

ピクセル比1の板を置く

例えばカメラからそのテクスチャーを貼り付けた板までの距離をzDepthとして
テクスチャーの横幅に大きさ1の板の大きさを合わせたかったら

planeWidth=Mathf.Tan(Mathf.Deg2Rad*camera.fieldOfView*0.5)*zDepth*texWidth/Screen.currentResolution.width;
transform.localscale=new Vector3(planeWidth,planeWidth*texHeight/texWidth,1);

とかにすれば大体合うんじゃないか?

Fps計測


あんま意味ないけどFPSを計測するためのスクリプト
さがせばいくらでもあるけど一応自分で書いておいた。

using UnityEngine;
using System.Collections;

public class FpsDisp : MonoBehaviour {
	
	int fpsCount;
	float timeCount;
	string fpsDisp;
	const string fps="FPS=";
	

	// Use this for initialization
	void Start () {
		fpsCount=0;
		timeCount=0;
		fpsDisp="0";
	
	}
	
	// Update is called once per frame
	void Update () {
		if(timeCount>=1){
			timeCount-=1;
			fpsDisp=fps+(fpsCount.ToString());
			guiText.text=fpsDisp;
			fpsCount=0;
		}
		fpsCount++;
		timeCount+=Time.deltaTime;	
	}
}

UnityのQuaternion


UnityのQuaternionの中身は虚部がそれぞれの要素*sin(theta/2)で実部がcos(theta/2)らしい。

一応確かめてみようと思って適当にスクリプト書いて試してみた。

using UnityEngine;
using System.Collections;

public class quartAngleGui : MonoBehaviour {

	public GameObject target;
	
	Vector3 quartToAngle;
	string printString;
	Quaternion targetRotation;
	float angle;
	float angleX,angleY,angleZ;
	
	void Update(){
		if(target){
			targetRotation=target.transform.rotation;
			quartToAngle.x=targetRotation.x;
			quartToAngle.y=targetRotation.y;
			quartToAngle.z=targetRotation.z;
			angle=Mathf.Acos(targetRotation.w);
			angle*=2;
			angle*=Mathf.Rad2Deg;
			
			quartToAngle.Normalize();
			angleX=angle*quartToAngle.x*quartToAngle.x;
			angleY=angle*quartToAngle.y*quartToAngle.y;
			angleZ=angle*quartToAngle.z*quartToAngle.z;

			
			printString="x="+angleX.ToString()+"\ny="+angleY.ToString()+"\nz="+angleZ.ToString()+"\nTransY="+targetRotation.eulerAngles.y.ToString();
			
			guiText.text=printString;
			
		}
	}
	
}