Nao_uの日記 このページをアンテナに追加 RSSフィード

2016-07-17

[]気分転換に 気分転換に - Nao_uの日記 を含むブックマーク はてなブックマーク - 気分転換に - Nao_uの日記 気分転換に - Nao_uの日記 のブックマークコメント

f:id:Nao_u:20160717225555p:image

地面に鏡を置いてdofでぼかすとそれっぽい絵が出ることがわかった

これのコースエディタをHoudiniで、とか


あとINSIDEクリアした

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160717

2016-07-16

[]簡単な鏡の作り方 簡単な鏡の作り方 - Nao_uの日記 を含むブックマーク はてなブックマーク - 簡単な鏡の作り方 - Nao_uの日記 簡単な鏡の作り方 - Nao_uの日記 のブックマークコメント

MirrorReflectionのシェーダーをMirrorReflection.csを入れたオブジェクトに割り当てるだけ。Y+方向に鏡が発生。

Shader "FX/MirrorReflection"

{

Properties

{

_MainTex ("Base (RGB)", 2D) = "white" {}

[HideInInspector] _ReflectionTex ("", 2D) = "white" {}

}

SubShader

{

Tags { "RenderType"="Opaque" }

LOD 100

Pass {

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

struct v2f

{

float2 uv : TEXCOORD0;

float4 refl : TEXCOORD1;

float4 pos : SV_POSITION;

};

float4 _MainTex_ST;

v2f vert(float4 pos : POSITION, float2 uv : TEXCOORD0)

{

v2f o;

o.pos = mul (UNITY_MATRIX_MVP, pos);

o.uv = TRANSFORM_TEX(uv, _MainTex);

o.refl = ComputeScreenPos (o.pos);

return o;

}

sampler2D _MainTex;

sampler2D _ReflectionTex;

fixed4 frag(v2f i) : SV_Target

{

fixed4 tex = tex2D(_MainTex, i.uv);

fixed4 refl = tex2Dproj(_ReflectionTex, UNITY_PROJ_COORD(i.refl));

return tex * refl;

}

ENDCG

}

}

}

using UnityEngine;

using System.Collections;

// This is in fact just the Water script from Pro Standard Assets,

// just with refraction stuff removed.

[ExecuteInEditMode] // Make mirror live-update even when not in play mode

public class MirrorReflection : MonoBehaviour

{

public bool m_DisablePixelLights = true;

public int m_TextureSize = 256;

public float m_ClipPlaneOffset = 0.07f;

public LayerMask m_ReflectLayers = -1;

private Hashtable m_ReflectionCameras = new Hashtable(); // Camera -> Camera table

private RenderTexture m_ReflectionTexture = null;

private int m_OldReflectionTextureSize = 0;

private static bool s_InsideRendering = false;

// This is called when it's known that the object will be rendered by some

// camera. We render reflections and do other updates here.

// Because the script executes in edit mode, reflections for the scene view

// camera will just work!

public void OnWillRenderObject()

{

var rend = GetComponent<Renderer>();

if (!enabled || !rend || !rend.sharedMaterial || !rend.enabled)

return;

Camera cam = Camera.current;

if( !cam )

return;

// Safeguard from recursive reflections.

if( s_InsideRendering )

return;

s_InsideRendering = true;

Camera reflectionCamera;

CreateMirrorObjects( cam, out reflectionCamera );

// find out the reflection plane: position and normal in world space

Vector3 pos = transform.position;

Vector3 normal = transform.up;

// Optionally disable pixel lights for reflection

int oldPixelLightCount = QualitySettings.pixelLightCount;

if( m_DisablePixelLights )

QualitySettings.pixelLightCount = 0;

UpdateCameraModes( cam, reflectionCamera );

// Render reflection

// Reflect camera around reflection plane

float d = -Vector3.Dot (normal, pos) - m_ClipPlaneOffset;

Vector4 reflectionPlane = new Vector4 (normal.x, normal.y, normal.z, d);

Matrix4x4 reflection = Matrix4x4.zero;

CalculateReflectionMatrix (ref reflection, reflectionPlane);

Vector3 oldpos = cam.transform.position;

Vector3 newpos = reflection.MultiplyPoint( oldpos );

reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection;

// Setup oblique projection matrix so that near plane is our reflection

// plane. This way we clip everything below/above it for free.

Vector4 clipPlane = CameraSpacePlane( reflectionCamera, pos, normal, 1.0f );

//Matrix4x4 projection = cam.projectionMatrix;

Matrix4x4 projection = cam.CalculateObliqueMatrix(clipPlane);

reflectionCamera.projectionMatrix = projection;

reflectionCamera.cullingMask = ~(1<<4) & m_ReflectLayers.value; // never render water layer

reflectionCamera.targetTexture = m_ReflectionTexture;

GL.SetRevertBackfacing (true);

reflectionCamera.transform.position = newpos;

Vector3 euler = cam.transform.eulerAngles;

reflectionCamera.transform.eulerAngles = new Vector3(0, euler.y, euler.z);

reflectionCamera.Render();

reflectionCamera.transform.position = oldpos;

GL.SetRevertBackfacing (false);

Material[] materials = rend.sharedMaterials;

foreach( Material mat in materials ) {

if( mat.HasProperty("_ReflectionTex") )

mat.SetTexture( "_ReflectionTex", m_ReflectionTexture );

}

// Restore pixel light count

if( m_DisablePixelLights )

QualitySettings.pixelLightCount = oldPixelLightCount;

s_InsideRendering = false;

}

// Cleanup all the objects we possibly have created

void OnDisable()

{

if( m_ReflectionTexture ) {

DestroyImmediate( m_ReflectionTexture );

m_ReflectionTexture = null;

}

foreach( DictionaryEntry kvp in m_ReflectionCameras )

DestroyImmediate( ((Camera)kvp.Value).gameObject );

m_ReflectionCameras.Clear();

}

private void UpdateCameraModes( Camera src, Camera dest )

{

if( dest == null )

return;

// set camera to clear the same way as current camera

dest.clearFlags = src.clearFlags;

dest.backgroundColor = src.backgroundColor;

if( src.clearFlags == CameraClearFlags.Skybox )

{

Skybox sky = src.GetComponent(typeof(Skybox)) as Skybox;

Skybox mysky = dest.GetComponent(typeof(Skybox)) as Skybox;

if( !sky || !sky.material )

{

mysky.enabled = false;

}

else

{

mysky.enabled = true;

mysky.material = sky.material;

}

}

// update other values to match current camera.

// even if we are supplying custom camera&projection matrices,

// some of values are used elsewhere (e.g. skybox uses far plane)

dest.farClipPlane = src.farClipPlane;

dest.nearClipPlane = src.nearClipPlane;

dest.orthographic = src.orthographic;

dest.fieldOfView = src.fieldOfView;

dest.aspect = src.aspect;

dest.orthographicSize = src.orthographicSize;

}

// On-demand create any objects we need

private void CreateMirrorObjects( Camera currentCamera, out Camera reflectionCamera )

{

reflectionCamera = null;

// Reflection render texture

if( !m_ReflectionTexture || m_OldReflectionTextureSize != m_TextureSize )

{

if( m_ReflectionTexture )

DestroyImmediate( m_ReflectionTexture );

m_ReflectionTexture = new RenderTexture( m_TextureSize, m_TextureSize, 16 );

m_ReflectionTexture.name = "__MirrorReflection" + GetInstanceID();

m_ReflectionTexture.isPowerOfTwo = true;

m_ReflectionTexture.hideFlags = HideFlags.DontSave;

m_OldReflectionTextureSize = m_TextureSize;

}

// Camera for reflection

reflectionCamera = m_ReflectionCameras[currentCamera] as Camera;

if( !reflectionCamera ) // catch both not-in-dictionary and in-dictionary-but-deleted-GO

{

GameObject go = new GameObject( "Mirror Refl Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera), typeof(Skybox) );

reflectionCamera = go.camera;

reflectionCamera.enabled = false;

reflectionCamera.transform.position = transform.position;

reflectionCamera.transform.rotation = transform.rotation;

reflectionCamera.gameObject.AddComponent("FlareLayer");

go.hideFlags = HideFlags.HideAndDontSave;

m_ReflectionCameras[currentCamera] = reflectionCamera;

}

}

// Extended sign: returns -1, 0 or 1 based on sign of a

private static float sgn(float a)

{

if (a > 0.0f) return 1.0f;

if (a < 0.0f) return -1.0f;

return 0.0f;

}

// Given position/normal of the plane, calculates plane in camera space.

private Vector4 CameraSpacePlane (Camera cam, Vector3 pos, Vector3 normal, float sideSign)

{

Vector3 offsetPos = pos + normal * m_ClipPlaneOffset;

Matrix4x4 m = cam.worldToCameraMatrix;

Vector3 cpos = m.MultiplyPoint( offsetPos );

Vector3 cnormal = m.MultiplyVector( normal ).normalized * sideSign;

return new Vector4( cnormal.x, cnormal.y, cnormal.z, -Vector3.Dot(cpos,cnormal) );

}

// Calculates reflection matrix around the given plane

private static void CalculateReflectionMatrix (ref Matrix4x4 reflectionMat, Vector4 plane)

{

reflectionMat.m00 = (1F - 2F*plane[0]*plane[0]);

reflectionMat.m01 = ( - 2F*plane[0]*plane[1]);

reflectionMat.m02 = ( - 2F*plane[0]*plane[2]);

reflectionMat.m03 = ( - 2F*plane[3]*plane[0]);

reflectionMat.m10 = ( - 2F*plane[1]*plane[0]);

reflectionMat.m11 = (1F - 2F*plane[1]*plane[1]);

reflectionMat.m12 = ( - 2F*plane[1]*plane[2]);

reflectionMat.m13 = ( - 2F*plane[3]*plane[1]);

reflectionMat.m20 = ( - 2F*plane[2]*plane[0]);

reflectionMat.m21 = ( - 2F*plane[2]*plane[1]);

reflectionMat.m22 = (1F - 2F*plane[2]*plane[2]);

reflectionMat.m23 = ( - 2F*plane[3]*plane[2]);

reflectionMat.m30 = 0F;

reflectionMat.m31 = 0F;

reflectionMat.m32 = 0F;

reflectionMat.m33 = 1F;

}

}

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160716

2016-07-09

[]渦巻と波 渦巻と波 - Nao_uの日記 を含むブックマーク はてなブックマーク - 渦巻と波 - Nao_uの日記 渦巻と波 - Nao_uの日記 のブックマークコメント

f:id:Nao_u:20160709234012p:image

CG WORLD 2015年3月号の記事を参考に、波をテスト中。

f:id:Nao_u:20160709234938p:image

指定軸を中心に、距離減衰させながら回転させてるだけの簡単な仕組みなのに、工夫次第でいろいろと複雑な動きが作れそうで、これはHoudiniに限らず応用範囲が広そうな。

次の世代のエフェクトは、ノードベースのシェーダーだけでなく頂点変形もノードベースで行うようになるだろうから、その時にはこの手のノウハウが活躍しそう。


VOPの使い方 VOPの使い方 - Nao_uの日記 を含むブックマーク はてなブックマーク - VOPの使い方 - Nao_uの日記 VOPの使い方 - Nao_uの日記 のブックマークコメント

  • aanoize でノイズ生成

ノードの自動作成

各種入力プラグを中ボタンでクリックすると、よく使うノード(場合によっては小さなノードネットワーク)を自動作成できるようだ。

特徴的なのはPromote Parameterで、Parameterノードが接続されたパラメータは、親のShaderノード内にExposeされ、VOPネットワークに入らなくても触れるようになる。

Defining up vector for copy sop Defining up vector for copy sop  - Nao_uの日記 を含むブックマーク はてなブックマーク - Defining up vector for copy sop  - Nao_uの日記 Defining up vector for copy sop  - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160709

2016-07-02

UE4のスプラインツール UE4のスプラインツール - Nao_uの日記 を含むブックマーク はてなブックマーク - UE4のスプラインツール - Nao_uの日記 UE4のスプラインツール - Nao_uの日記 のブックマークコメント

実際問題としてこういうのはHoudini Engineで組むよりゲームエンジンの拡張として作ったほうが使いやすいものになりそうで、Houdiniを実用的に使うことの難しさをひしひしと感じる

【モデリング】vertexの結合の仕方(Fuseの使い方) 【モデリング】vertexの結合の仕方(Fuseの使い方)  - Nao_uの日記 を含むブックマーク はてなブックマーク - 【モデリング】vertexの結合の仕方(Fuseの使い方)  - Nao_uの日記 【モデリング】vertexの結合の仕方(Fuseの使い方)  - Nao_uの日記 のブックマークコメント

[] 2016-07-02 - Nao_uの日記 を含むブックマーク 2016-07-02 - Nao_uの日記 のブックマークコメント

f:id:Nao_u:20160704195456p:image

  • 適当なgridをmountainで変形
  • lineをcurveでsweep(sweepのoutput→Skin Outputで、Skin Unclosedを選ぶとそのままポリゴンが貼れる)
  • convertでポリゴンを張ったカーブのNURBSを割る(ラインとカーブの両方をNURBSにしておく必要があることに注意)
    • 2つに分岐。片方はtransformで上にあげて、polyextudeで足を延ばしてgridで作った地面にcookie(ブーリアン演算)でくり抜く
    • 分岐のもう片方は、作った道をrayで地面位置に投影して、polyextudeで盛り上げるか盛り下げるかする
  • 作った道とくり抜いたgridの地面をmerge
  • polystichで空いた穴を埋める

マテリアルの割り当て方 マテリアルの割り当て方 - Nao_uの日記 を含むブックマーク はてなブックマーク - マテリアルの割り当て方 - Nao_uの日記 マテリアルの割り当て方 - Nao_uの日記 のブックマークコメント

f:id:Nao_u:20160704233322p:image

テクスチャを張った。UVの割り当ては元のLineにU座標を入れておいて、V座標はsweep後にsortして、floor($PT/4)*0.1 みたいな感じで横の点の数を定数に割り当てて入れた。(もっといいやり方はないのか?)

なるべく早い段階で入れないとまともにsortができなかったりとか、この辺もっとノウハウを積まないと。


f:id:Nao_u:20160704233321p:image

平らにしてUnityに持っていけばすぐ走れるように。ちょっとデータを変えてfbxエクスポートするだけで道を簡単に加工できる。ちゃんと使えるようになれば、取り回しは便利そう。

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160702

2016-07-01

[]houdini日記 houdini日記 - Nao_uの日記 を含むブックマーク はてなブックマーク - houdini日記 - Nao_uの日記 houdini日記 - Nao_uの日記 のブックマークコメント

UnityのAsset Store経由で買ったHoudini Indieのライセンスがトラブりつつもようやく届いて、これでHoudini Engineが使えるかと思ったら、Facebook経由で作っていたsideEffectのアカウントとUnity経由で勝手に作られた(?)アカウントがかぶってて、試用版のHoudini Engineのライセンスがうまく消せなくなってる…。ややこしいことになっていそう。試用期間の30日が切れるまで待つ?

FBX出力だけはできるようになったので、とりあえず実験。

f:id:Nao_u:20160702120915p:image

カーブで作ったコースを使って、四角い山をトンネルでくり抜く


f:id:Nao_u:20160702120701p:image

fbx出力して、Unityで動いた


f:id:Nao_u:20160702122633p:image

適当に作ったコースをすぐに車で走れるように。ちょっとうれしい


マテリアルの設定方法 マテリアルの設定方法 - Nao_uの日記 を含むブックマーク はてなブックマーク - マテリアルの設定方法 - Nao_uの日記 マテリアルの設定方法 - Nao_uの日記 のブックマークコメント

  • http://ikatnek.blogspot.jp/p/material-assignment.html
    • Groupを作って、Materialを割り当てる
    • objectの中にSHOPネットワークを作って入れておくと整理しやすい
    • UVが必要な時には、UV Texture ノードまたは UV Projectを使用する
トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160701

2016-06-30

Basics : Curves Basics : Curves  - Nao_uの日記 を含むブックマーク はてなブックマーク - Basics : Curves  - Nao_uの日記 Basics : Curves  - Nao_uの日記 のブックマークコメント


  • ends : カーブの終端の処理
    • close U でカーブを閉じられる?
  • carve : カーブの部分切り出し
    • First U, Second U で始点と終点を選んで切り出し
    • Keep Inside, Outsideで切り出した外を残すこともできる
  • refine : カーブの指定区間のポイントを増やすなどの加工
    • First UからSecond Uまでの区間をU Divisions個に再分割
  • curvesect : 2つの入力カーブの交点を追加
    • keep odd Numbersed ones で交点の片側のみを残すこともできる

コピーとインスタンスのポイントアトリビュート コピーとインスタンスのポイントアトリビュート - Nao_uの日記 を含むブックマーク はてなブックマーク - コピーとインスタンスのポイントアトリビュート - Nao_uの日記 コピーとインスタンスのポイントアトリビュート - Nao_uの日記 のブックマークコメント

ポイント上にコピーやインスタンスを作成するとき、Houdiniは各コピー/インスタンス毎にそのポイントから特定のアトリビュートを探します。

O = orient matrix

S = scale matrix (scale * pscale)

L = alignment matrix (*)

R = rot matrix

T = trans matrix (trans + P)


(*) The alignment matrix (L) is defined by N or v and up.


IF N exists AND up exists and isn't {0,0,0}:

L = mlookatup(N,0,up)

ELSE IF N exists:

L = dihedral({0,0,1},N)

ELSE IF v exists AND up exists and isn't {0,0,0}:

L = mlookatup(v,0,up)

ELSE IF v exists:

L = dihedral({0,0,1},v)

IF orient exists:

Transform = O*R*S*T

ELSE:

Transform = S*L*R*T

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160630

2016-06-29

[]Houdini日記 Houdini日記 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini日記 - Nao_uの日記 Houdini日記 - Nao_uの日記 のブックマークコメント

基本操作

[ショートカット]

  • SPACE+1 : 通常カメラ
  • SPACE+2 : 上下の並行投影
  • SPACE+3 : 前後の並行投影
  • SPACE+4 : 左右の並行投影
  • SPACE+5 : UV展開
  • 2 : ポイント選択
  • 3 : エッジ選択
  • 4 : プリミティブ選択
  • T : 移動
  • R : 回転
  • E : スケーリング
  • N : 点の全選択
  • 編集時に座標軸を右クリック→Align Handleで座標系を変えられる
  • M : 移動時の軸の座標をトグル
  • ポイント移動時に左下のゲージで範囲指定ができる
  • EDITの「USE MIRROR」でミラー移動

右クリックメニューで確認できるショートカット

  • B : ブラシハンドル:
  • H : ピークハンドル:
  • Y : Translate/Rotate/Scale:通常使うやつ
トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160629

2016-06-28

Defining up vector for copy sop Defining up vector for copy sop  - Nao_uの日記 を含むブックマーク はてなブックマーク - Defining up vector for copy sop  - Nao_uの日記 Defining up vector for copy sop  - Nao_uの日記 のブックマークコメント

Point SOP の Particleタブに「Add Up Vector」という項目がある。

f:id:Nao_u:20160627230341p:image

ただ、中身はVOPなどで欲しい値を入れる必要があるので Create Attribute しても大差ない


イラストっぽい針葉樹の作成 イラストっぽい針葉樹の作成 - Nao_uの日記 を含むブックマーク はてなブックマーク - イラストっぽい針葉樹の作成 - Nao_uの日記 イラストっぽい針葉樹の作成 - Nao_uの日記 のブックマークコメント

Houdini チュートリアルーーヴォロノイーー Houdini チュートリアルーーヴォロノイーー - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini チュートリアルーーヴォロノイーー - Nao_uの日記 Houdini チュートリアルーーヴォロノイーー - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160628

2016-06-27

【Houdini】内積と外積を駆使した階段作成 【Houdini】内積と外積を駆使した階段作成 - Nao_uの日記 を含むブックマーク はてなブックマーク - 【Houdini】内積と外積を駆使した階段作成 - Nao_uの日記 【Houdini】内積と外積を駆使した階段作成 - Nao_uの日記 のブックマークコメント

Houdiniの学習について Houdiniの学習について  - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdiniの学習について  - Nao_uの日記 Houdiniの学習について  - Nao_uの日記 のブックマークコメント

HoudiniYoutube公式チャンネルのQuickStart Lessonはお勧めです。

いろいろ調べるよりこれ全部見たほうが早いので紹介しておきます。


https://www.youtube.com/playlist?list=PLXNFA1EysfYmvtkRsL_cgvECQdM_8sOr4


字幕で日本語が選べるので、取り組みはじめには最適だと思います。


Houdini チュートリアルーーVOP Transferーー Houdini チュートリアルーーVOP Transferーー - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini チュートリアルーーVOP Transferーー - Nao_uの日記 Houdini チュートリアルーーVOP Transferーー - Nao_uの日記 のブックマークコメント

とりあえずはここに書いてあることが理解できるようにならないと…


Point follow a path without "Path Object" Point follow a path without "Path Object"  - Nao_uの日記 を含むブックマーク はてなブックマーク - Point follow a path without "Path Object"  - Nao_uの日記 Point follow a path without "Path Object"  - Nao_uの日記 のブックマークコメント

いろんなやりかたがありすぎてよくわからない


タコの足を作る タコの足を作る - Nao_uの日記 を含むブックマーク はてなブックマーク - タコの足を作る - Nao_uの日記 タコの足を作る - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160627

2016-06-26

[]Houdini日記 Houdini日記 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini日記 - Nao_uの日記 Houdini日記 - Nao_uの日記 のブックマークコメント

sweepの方向指定は N と up が使えるらしい。

Attribute create で up という名前で(0,1,0)を入れると、カーブの傾きにかかわらず上向きの捻じれのないオブジェクトが配置できた。

f:id:Nao_u:20160626132459p:image

あとはこれをどうやってほしい向きに向けるか。

たぶんSphereから取り出したpointの向きを使用してupベクトルとNを生成したら行けそうな気がするんだけど、そろそろVOPやVEXを避けて通れなくなってきた雰囲気が。

  • Houdiniレシピ:カーブの接線を取得

そもそも一度作ったカーブに点を増やす方法を知らなかったりなど基本的なオペレーションの知識不足もあったりしてて、どこからどう調べて何から手を付けたらいいか、みたいな段階で困ってる。基本的なことを調べるのにいちいち無駄に時間がかかってる感じなので、系統立てて作られた日本語マニュアルほしい



f:id:Nao_u:20160626213019p:image

  • VOPで 自分の頂点 - 一つ前の頂点 のベクトルを N に入れる
    • Input を Fiest Input にする必要がある(デフォルトではファイルから)

Houdini 基本を掘り下げる Houdini 基本を掘り下げる - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini 基本を掘り下げる - Nao_uの日記 Houdini 基本を掘り下げる - Nao_uの日記 のブックマークコメント

簡単なVOPの説明 (SOP) 簡単なVOPの説明 (SOP) - Nao_uの日記 を含むブックマーク はてなブックマーク - 簡単なVOPの説明 (SOP) - Nao_uの日記 簡単なVOPの説明 (SOP) - Nao_uの日記 のブックマークコメント

VEX関数のヘルプの見方 1 VEX関数のヘルプの見方 1 - Nao_uの日記 を含むブックマーク はてなブックマーク - VEX関数のヘルプの見方 1 - Nao_uの日記 VEX関数のヘルプの見方 1 - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160626

2016-06-25

[]Houdini日記 Houdini日記 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini日記 - Nao_uの日記 Houdini日記 - Nao_uの日記 のブックマークコメント

当面の目標は、

  • ジェットコースターのレール
  • 簡単なビルっぽい構造物(階段付き)
  • 道路(十字路含む)

みたいなものをUnityのアセットとして気軽に作れるようになること。

とりあえずはレールや手すりのようなものを新しく覚えた知識を利用して繰り返し組みなおしてみる。下手に複雑なものを積み上げるよりは、毎回ゼロから繰り返し手を動かして体で覚えるのがよさそう。

やり方がわからなかったり、面倒に感じたことが出たらその都度調べながら、知識を増やしてフィードバックしてく感じで。

HoudiniのSOPのサンプルデータ HoudiniのSOPのサンプルデータ - Nao_uの日記 を含むブックマーク はてなブックマーク - HoudiniのSOPのサンプルデータ - Nao_uの日記 HoudiniのSOPのサンプルデータ - Nao_uの日記 のブックマークコメント

  • \houdini\help\examples\nodes\sop にそれぞれのSOPのサンプルデータが入っている。使い方がわからないときにはこの辺を開いて弄ってみるのが早そう

Houdiniチュートリアル動画 Houdiniチュートリアル動画 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdiniチュートリアル動画 - Nao_uの日記 Houdiniチュートリアル動画 - Nao_uの日記 のブックマークコメント

線路の枕木をもっと精度よく乗せるには(Houdini Tutorial #5.1 (Modelling Railroad Bonus) ) 線路の枕木をもっと精度よく乗せるには(Houdini Tutorial #5.1 (Modelling Railroad Bonus) ) - Nao_uの日記 を含むブックマーク はてなブックマーク - 線路の枕木をもっと精度よく乗せるには(Houdini Tutorial #5.1 (Modelling Railroad Bonus) ) - Nao_uの日記 線路の枕木をもっと精度よく乗せるには(Houdini Tutorial #5.1 (Modelling Railroad Bonus) ) - Nao_uの日記 のブックマークコメント

  • https://www.youtube.com/watch?v=LvdttNWNJ4A
    • レールの枕木を生成するのに、Curveのリサンプル間隔を変えた点に置くだけでは、細かく割られレールのカーブの法線とずれてしまう
    • →線路の点を数点おきに別のグループ化して、そのグループに枕木を置くと、同じ分割点に枕木が出るのでずれない
      • (こういう細かいことを気にし始めると工夫したノード構成が必要になる…)

レール レール - Nao_uの日記 を含むブックマーク はてなブックマーク - レール - Nao_uの日記 レール - Nao_uの日記 のブックマークコメント

f:id:Nao_u:20160625173446p:image

平面上のカーブに合わせてオブジェクトを置いたりプリミティブをsweep->skinで伸ばしたりしてレールっぽいものは作れるようになったが、

f:id:Nao_u:20160625173524p:image

カーブのY軸を動かすと法線が壊れてぐちゃぐちゃに。カーブの点のマトリクスを弄る方法がわからない…。


カーブに法線をつける方法 カーブに法線をつける方法 - Nao_uの日記 を含むブックマーク はてなブックマーク - カーブに法線をつける方法 - Nao_uの日記 カーブに法線をつける方法 - Nao_uの日記 のブックマークコメント

※これは思ってるのと違った

  • Sphereのpointを取り出すと、純粋な点が取り出せる。その時にNormalを追加して、任意の向きのNoramlを持った点をsweepすることで、カーブに乗せるオブジェクトの向きを制御している
  • が、Noramlを持った点をEditで回転させてもNoramlは回らないし、Editした瞬間にすべての点のNormalが0ベクトルになって消える…。

Copy along path with orientation Copy along path with orientation - Nao_uの日記 を含むブックマーク はてなブックマーク - Copy along path with orientation - Nao_uの日記 Copy along path with orientation - Nao_uの日記 のブックマークコメント

use Polyframe SOP to create tangent and up vector for your curve


then use attribute SOP to rename

“normal” to “up”

“tangentu” to “N”

(because just specifying name in polyframe doesn't always work with “N”)


in closed curves you need to use “tangentv” as “N” to get tangent vector

you can also create arbitrary “up” if you want to avoid some problems


copy SOP will then compute rotation automatically according to “up” and “N”


or use this method

http://www.sidefx.com/index.php?option=com_content&task=view&id=1242&Itemid=132 [sidefx.com]

※これでもうまくいかない…

  • 以前に見つけたPolyFrameを使って法線を生成する方法。
  • Tangent Nameを N にすることでカーブの軸向きの法線を生む
    • が、こちらもEditすると消えるのは同じ。
トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160625

2016-06-24

Manipuating the Range 01 in Houdini FX onVimeo Manipuating the Range 01 in Houdini FX onVimeo - Nao_uの日記 を含むブックマーク はてなブックマーク - Manipuating the Range 01 in Houdini FX onVimeo - Nao_uの日記 Manipuating the Range 01 in Houdini FX onVimeo - Nao_uの日記 のブックマークコメント

いろんなサンプルデータ いろんなサンプルデータ - Nao_uの日記 を含むブックマーク はてなブックマーク - いろんなサンプルデータ - Nao_uの日記 いろんなサンプルデータ - Nao_uの日記 のブックマークコメント

チュートリアル動画集 チュートリアル動画集 - Nao_uの日記 を含むブックマーク はてなブックマーク - チュートリアル動画集 - Nao_uの日記 チュートリアル動画集 - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160624

2016-06-22

[]Houdini日記 Houdini日記 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini日記 - Nao_uの日記 Houdini日記 - Nao_uの日記 のブックマークコメント

f:id:Nao_u:20160625175451p:image

カーブに沿った柵を作るテスト。

  • Curbeの法線や接線をとる方法
    • polyFrameノードで、法線・タンジェント、バイタンジェントが生成できる
      • StyleをTwo Edgeにすると二点の補間で生成してくれてきれいになる
      • Tangent Name を N に設定することで、@Nを上書きできる(こんなことやってよかったんだ…)
      • NURBSのカーブにresampleで点を増やすときには「Resample by Polygon Edge」のチェックを外さないと曲率によって点の間隔がかわってしまう

Houdiniレシピ:SweepとSkinで作るこういうの Houdiniレシピ:SweepとSkinで作るこういうの - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdiniレシピ:SweepとSkinで作るこういうの - Nao_uの日記 Houdiniレシピ:SweepとSkinで作るこういうの - Nao_uの日記 のブックマークコメント

    • sweepしたあとskinで面を張るには、sweepする形状がPolygonである必要がある。Primitiveだとダメなのに気づかず、だいぶハマった…
    • 生成した形状に法線を設定するのは、normalノードをつなぐ必要がある?他の方法がある?
トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160622

2016-06-19

[]Houdini日記 Houdini日記 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini日記 - Nao_uの日記 Houdini日記 - Nao_uの日記 のブックマークコメント

  • 骨組みだけのビルっぽい構造物で、幅と高さ、階数を指定すると非常階段付きのモデルが出せるhdaが作れた(チュートリアル動画にあるやつみたいなの)
    • が、Houdini Apprentice版ではUnityのHoudini Engineで読めるアセットが作れないらしい…。Indie版を買うしかないか
  • 購入ルートがよくわからなかったのでUnityのAssetStoreから買ってみた。199$。更新時にはどこからお金が落ちるのか
  • 購入したらSideEffectからメールが来るらしいけど来ない
  • ついでにUnityのLevel11でHBAOのアセットが無料だったので落とした。品質の高いAOが出るので素ポリゴンのアセット確認に活躍しそう。もうUnityの有料ライセンス切れてるかと思ってたので気づいてよかった

HDAの作り方 HDAの作り方 - Nao_uの日記 を含むブックマーク はてなブックマーク - HDAの作り方 - Nao_uの日記 HDAの作り方 - Nao_uの日記 のブックマークコメント

  • /objから該当オブジェクトのノードを右クリックして「Create Digital Asset」を選択
  • Extending Parameters にノードからドラッグ&ドロップで必要なパラメータを追加
  • 該当オブジェクトのノードを右クリックして「Save Node Type」でhdaを保存

Houdini Engine のUnityプラグインの解説動画 Houdini Engine のUnityプラグインの解説動画 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini Engine のUnityプラグインの解説動画 - Nao_uの日記 Houdini Engine のUnityプラグインの解説動画 - Nao_uの日記 のブックマークコメント

リファレンス Edit Parameter Interfaceウィンドウ リファレンス Edit Parameter Interfaceウィンドウ - Nao_uの日記 を含むブックマーク はてなブックマーク - リファレンス Edit Parameter Interfaceウィンドウ - Nao_uの日記 リファレンス Edit Parameter Interfaceウィンドウ - Nao_uの日記 のブックマークコメント

http://sidefx.jp/doc/ref/windows/edit_parameter_interface.html

他のノードからパラメータをインポートすると、ソースパラメータがターゲットパラメータ値を参照できるようにHoudiniは自動的にソースパラメータに対してパラメータ参照エクスプレッションを設定します。一度パラメータをインポートしてしまえば、ソースパラメータではなくターゲットパラメータのみを使って編集するべきです(ターゲットパラメータとの接続を削除しない限り)

インポートしたパラメータは、元ノードの値を編集すべきでないらしい。

(リンクが切れてうまく動かなくなる?)

Houdini15 Indie インストールメモ Houdini15 Indie インストールメモ - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini15 Indie インストールメモ - Nao_uの日記 Houdini15 Indie インストールメモ - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160619

2016-06-18

[]Houdini日記 Houdini日記 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini日記 - Nao_uの日記 Houdini日記 - Nao_uの日記 のブックマークコメント

f:id:Nao_u:20160625175452p:image

  • サッカーボール破壊。最初のチュートリアルとしてはわかりやすい

  • いろんなチュートリアルビデオを見ながら、見よう見まねでビルっぽい構造物を幅、高さ、フロア数を指定してリピートできるように。
    • 基本のBoxを作って、gridの頂点に乗せてcopyしたり、床のboxノードの幅を適当に弄ったリファレンスをパラメータに幅を決めたり移動させたりでそれっぽいものは作れるみたい
      • 単純な形を作るだけなら「面白いなぁ」くらいですむけど、複雑な形を制御するのは相当に大変そう
      • 床と柱の角などの微妙なずれの吸収を数式で入れてくの、把握しきれなくなりそう
  • パラメータ指定一つで構造物が無制限に伸ばせるのは、Matrix(映画)みたいな感じで面白い

[]Houdini Engine、Unity5で使うには、 Houdini Engine、Unity5で使うには、 - Nao_uの日記 を含むブックマーク はてなブックマーク - Houdini Engine、Unity5で使うには、 - Nao_uの日記 Houdini Engine、Unity5で使うには、 - Nao_uの日記 のブックマークコメント

      • \Houdini 15.5.480\engine\unity\Assets
    • の下をUnityの該当プロジェクトのAssetsフォルダの下に丸コピーする必要があった
  • ライセンスのためにアカウントを作るのが面倒だったので、とりあえず30日試用版で。

カーブに沿った柵の作り方動画 カーブに沿った柵の作り方動画 - Nao_uの日記 を含むブックマーク はてなブックマーク - カーブに沿った柵の作り方動画 - Nao_uの日記 カーブに沿った柵の作り方動画 - Nao_uの日記 のブックマークコメント

  • https://www.youtube.com/watch?v=zGGBYYrh4g0
    • polyextrude : ポリゴンを伸ばしてスケーリングしたりする
    • polybevel : ポリゴンのエッジを丸くする(べベル)
    • resample : カーブの上に点を増やす
      • Length→点の間隔
      • Resamle Polygon Edge→ポリゴンエッジを維持?
  • https://www.youtube.com/watch?v=aLF0bbZwT2A
    • Sort : ソートする。
      • Shiftでポイント番号をずらせる
    • Point : 点を生成
      • Add Normal→法線を指定。XYZすべてに対してShiftした点を[$TX2-$TX]みたいな形で指定することで、点をつなぐ法線を生成?
トラックバック - http://game.g.hatena.ne.jp/Nao_u/20160618