Skip to main content
Participant
June 6, 2023
Question

レイヤー同士の距離によって参照するレイヤーを変えたいです。

  • June 6, 2023
  • 1 reply
  • 332 views

 数字の画像が入った10個ほどのレイヤーがコンポジションの中を飛び回っているものを作りました。それからさらに2つのレイヤーが重なったらその数字が足し合わされたレイヤーに変化するというものを作りたいのです。それで2つほど悩んでいることがあります。

 

1、thisLayerに一番近いレイヤーとの距離を常に参照して、距離が決めた数値を下回ったときに反応するようにしたいと考えています。あらかじめレイヤーを指定して参照するのではなく、レイヤー同士の距離によって参照するレイヤーをスムーズに切り替えたいのです。

 

2、レイヤーが重なった瞬間に重なった2つのレイヤーを消して(または透明にして)、新しいレイヤーを出現させ数値を引き継がせたいと考えています。レイヤーを新しく作成したり、複製がしたいです。

 

この2つが果たして可能なのか、またどうすればいいのか教えていただきたいです。

また、他にもっといい方法があればそれも教えてほしいです。

(AEを使って間もないので知識が足りないかもしれません、、、)

 

 

    This topic has been closed for replies.

    1 reply

    Community Expert
    June 6, 2023
    1 については、下記リンクのコードが参考になると思います。
     
    添付の動画は、こちらを一部書き換えて使用しています。
    他に、「sampleImage」メソッドをネット検索すると似たような効果になるものが見つかると思います。
     
    添付動画で使用してるコードは、下記になります。
    各レイヤーの不透明度に追加する。
    out = [100]
    for (i = 1; i <= thisComp.numLayers; i++){
      if (i == index) continue;
      L = thisComp.layer(i);
      if (! (L.active && L.hasVideo)) continue; 
      delta = ( thisLayer.width + L.width)/2;
      if (length(position, L.position) <= 100){  //  値は相互の距離(100px以下)
        out = [0];
        break;
      }
    }
    out
     
     
    2 については、レイヤーを増やすことは、エクスプレッションでは出来ないため、スクリプトや他の方法になります。
     
    エクスプレッションで行う場合は、レイヤーを作成しておいて、シェイプレイヤーの親子関係にしておきます。
    シェイプレイヤーの不透明度が100%の時に長方形は0%になるようにエクスプレッションを書きます。
    if (thisComp.layer("シェイプレイヤー 3").transform.opacity == 0){
    100;
    }else{
    0;
    }
     
    但し、すべてのシェイプに長方形のレイヤーを追加すると、位置がズレた状態で長方形が2個表示されるため、条件を色々追加して1個だけ表示させるようにする方法ならできると思います。
    Community Expert
    June 6, 2023
    <追記>
    コードを修正しました。
    6行目を書き換えて、7行目を参照元のコードと合わせました。
    数値は、微調整になります。
    out = [100]
     for (i = 1; i <= thisComp.numLayers; i++){
      if (i == index) continue;
      L = thisComp.layer(i);
      if (! (L.active && L.hasVideo)) continue; 
      delta = ( thisLayer.sourceRectAtTime().width + L.sourceRectAtTime().width)/2;
      if (length(position, L.position) <= delta - 50){  //  値は相互の距離の微調整(基準値”0”)
        out = [0];
        break;
      }
    }
    out
    Community Expert
    June 6, 2023

    <訂正>
    (2)にいついての回答で、長方形を親子にする方法の場合、コンポジションに新たなレイヤーが追加された為、(1)のエクスプレッションでは誤動作が起きます。
    長方形レイヤーの「位置」に近づくと反応してしまう為、(1)のエクスプレッションへさらに条件を追加する必要があるので、キーフレームやレイヤーのデュレーションなどで対応して下さい。

     

    <12:30更新>

    親子レイヤーの問題は、下記コードで改善します。

     

    out = [100]
     for (i = 1; i <= thisComp.numLayers; i++){
      if (i == index) continue;
      L = thisComp.layer(i);
      if (! (L.active && L.hasVideo)) continue; 
      if (L.hasParent) continue;
      delta = ( thisLayer.sourceRectAtTime().width + L.sourceRectAtTime().width)/2;
      if (length(position, L.position) <= delta - 50){  //  値は相互の距離の微調整(基準値”0”)
        out = [0];
        break;
      }
    }
    out