Jump to content
Unity Insider Forum

Sinus Kurve


Dominik

Recommended Posts

Hallo zusammen.

ich sitze nun schon seit etwas über 3 tagen an einem problem.

in der zeit hatte ich sogar schon versucht mein alten account zu aktivieren was mir bis heute noch nicht gelungen ist. die mail kam leider nicht an daher der neue account..

 

umzwar hänge ich an einem kleinem wellensystem die durch eine sinus kurve erzeugt werden soll.

leider habe ich kaum was mit sinus funktionen zutun gehabt daher kommen auch diverse probleme auf.

 

Hier mal der bisherige code. eingies könnte überflüssig sein da ich vieles getestet habe.

var arm1 :GameObject;
var arm2 :GameObject;
var arm3 :GameObject;
var arm4 :GameObject;
var arm_pos1 = 0;
var arm_pos2 = 90;
var arm_pos3 = 180;
var arm_pos4 = 270;
var arm1_speed;
var arm2_speed;
var arm3_speed;
var arm4_speed;
var wellenspeed :float; //geschwindigkeit
var wellenaktiv :boolean=false; // welleaktivieren
var wellenhub :float; // wellenhöhe
var counter : float;
function Update(){
var arm_winkel_1 = Mathf.Sin((arm_pos1 * Mathf.PI)/180);
var arm_winkel_2 = Mathf.Sin((arm_pos2 * Mathf.PI)/180);
var arm_winkel_3 = Mathf.Sin((arm_pos3 * Mathf.PI)/180);
var arm_winkel_4 = Mathf.Sin((arm_pos4 * Mathf.PI)/180);
counter += Time.deltaTime*wellenspeed;
//welle langsam de/aktivieren
if(wellenaktiv == true){
if(wellenhub < 20){
wellenhub += 1*Time.deltaTime;
}
}else if(wellenaktiv == false){
if(wellenhub > 0){
wellenhub -= 1*Time.deltaTime;
}
}
//testbewegung
arm1.hingeJoint.motor.targetVelocity = counter;
arm1.hingeJoint.motor.force = 1;
arm2.hingeJoint.motor.targetVelocity = counter;
arm2.hingeJoint.motor.force = 1;
arm3.hingeJoint.motor.targetVelocity = counter;
arm3.hingeJoint.motor.force = 1;
arm4.hingeJoint.motor.targetVelocity = counter;
arm4.hingeJoint.motor.force = 1;
counter =(Mathf.Sin(Time.time * wellenspeed)*wellenhub);
}

 

ansich klappt es auch, aber nicht so wie es sollte.

ich denke mal das ich das ganze ziemlich falsch angegangen bin.

 

ansich sind es 4 arme, die sich nach einander auf und abbewegen sollten.

in moment gehen sie alle auf einmal hoch.

 

meine frage ist wie bekäme ich es hin das die arme eine startposition haben und eine endposition. und generell wäre da nicht was anderes möglich?.

es muss auch nicht viel können. mir reichen einpaar ansätze

da ich keine guten ansätze kenne eine welle durch 4 arme zu jagen ohne das ich für jeden arm eine welle definieren muss. denn da fängt der ganze pfusch erst an. die arme bleiben dann einfach irgendwo stehen. und wenn der wellenhub auf 0 ist sollten die arme in der startposition sein.

die endposition soll halt vom wellenhub abhängig sein da es für die wellenhöhe wichtig ist.

die wellenhöhe sollte maximal 15° hoch sein. da der extenzer nur 7,5° abgelassen wird und dadurch eine welle von 15° grad erzeugt. es wäre sooo geil könnte man die 4 arme durch eine richtige welle jagen, wie ne art versatz.

 

falls mir keiner folgen kann.

 

hier ein video zu den 4 armen.

 

 

 

ich hoffe ihr könnt mir wenigstens einiger maßen verdeutlichen wie ich es richtig angehe.

Liebe Grüße Dominik

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey hoffe das hilft dir weiter habe einen Code geschrieben der dir 4 höhen ausgibt die im Sinus um jeweils 90° versetzt sind.

float winkel1 = 0;
 float winkel2 = 90;
 float winkel3 = 180;
 float winkel4 = 270;
 float hoehe = 50;
 float time = Time.deltaTime * Time.frameCount;
 float[] winkel = new float[4];
 winkel [0] = Mathf.Sin (time + winkel1) *hoehe + hoehe;
 winkel [1] = Mathf.Sin (time + winkel2) *hoehe + hoehe;
 winkel [2] = Mathf.Sin (time + winkel3) *hoehe + hoehe;
 winkel [3] = Mathf.Sin (time + winkel4) *hoehe + hoehe;
 print ("Winkel1:" + winkel[0] + "  Winkel2:"+winkel[1]+"  Winkel3:"+winkel[2]+"  Winkel4:"+winkel[3]);

 

um schneller oder langsamer hoch zu zählen müsstest du nur hinter "float time = Time.deltaTime * Time.frameCount;" *5 oder /5 oder so hinschreiben. Die höhe addiere ich immer um nicht in den Minus Bereich des Sinus zu kommen. Hilft dir das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

EDIT***

Fehler wurde doch nicht ganz behoben.

verstehe es leider noch nicht ganz.

Habe nun einiges versucht, aber es haut einfach gar nicht hin.

der wellenhub kann aktiviert werden. aber irgendwie nicht richtig deaktiviert.

bzw die arme bleiben dann einfach in der letzten position stehen.

dabei sollte die armhöhe "wellenhöhe" von dem wellenhub beeinflusst werden, da hier die min und max höhe festgelegt sind.

eventuell muss man das anders zusammen stellen aber irgendwie komm ich nicht auf dem richtigen weg.

 

die welle sollte nur von 0 bis 15° auf und abheben und durch eine seperate variable als geschwindigkeit angesteuert werden.

 

arm1 = mathf.sin(winkel1*winkelspittler *

wellenhöhe)*wellenspeed; hatte ich zuerst versucht aber dann scheint nix mehr zugehen.

kann ich das nicht irgendwie anders definieren?

damit sollte auch schon das problem gelöst sein.

 

hier der bisherige code

var arm1 :GameObject;
var arm2 :GameObject;
var arm3 :GameObject;
var arm4 :GameObject;
var winkel1 = 0;
var winkel2 = 90;
var winkel3 = 180;
var winkel4 = 270;
var wellenspeed :float;
var wellenaktiv :boolean=false;
var wellenhub :float;
var arme : float[];
var time :float=0;
var winkelsplitter: float = Mathf.PI/180;
function Update(){
var winkel1 = 0;
var winkel2 = 90;
var winkel3 = 180;
var winkel4 = 270;
time = Time.deltaTime * wellenspeed;
arme = new float[4];
arme [0] = Mathf.Sin (winkelsplitter*  winkel1 + time)*wellenhub;
arme [1] = Mathf.Sin (winkelsplitter*  winkel2 + time)*wellenhub;
arme [2] = Mathf.Sin (winkelsplitter*  winkel3 + time)*wellenhub;
arme [3] = Mathf.Sin (winkelsplitter*  winkel4 + time)*wellenhub;

arm1.hingeJoint.motor.targetVelocity = arme[0];
arm1.hingeJoint.motor.force = 1;
arm2.hingeJoint.motor.targetVelocity = arme[1];
arm2.hingeJoint.motor.force = 1;
arm3.hingeJoint.motor.targetVelocity = arme[2];
arm3.hingeJoint.motor.force = 1;
arm4.hingeJoint.motor.targetVelocity = arme[3];
arm4.hingeJoint.motor.force = 1;

if(wellenaktiv == true){
if(wellenhub < 15){
wellenhub += 0.3*Time.deltaTime;
}
}else if(wellenaktiv == false){
if(wellenhub > 0){
wellenhub -= 0.3*Time.deltaTime;
}
}
wellenhub = Mathf.Clamp(wellenhub, 0f, 15f);
}

danke vorab für jede antwort :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...

Sinus ist eine konstante Funktion. Wenn du dasselbe reinschmeißt, kommt dasselbe raus.

Der einzige nicht konstante Wert in deinen Sinus-Aufrufen kommt von der Variable "time", und diese wird so gesetzt:

time = Time.deltaTime * wellenspeed;

Time.deltaTime beschreibt die aktuell gültige Zeit seit dem jeweils letzten Frame. Wenn dein Programm zwischen 55 und 60 fps schwankt, schwankt Time.deltaTime zwischen 0.16 und 0.18. Du gibst also immer einen fast konstanten Wert in die Funktion.

 

Ich nehme an, du wolltest schreiben:

time += Time.deltaTime * wellenspeed;

 

Von

float time = Time.deltaTime * Time.frameCount;

würde ich in jedem Fall abraten :)

Wenn gewünscht, erkläre ich auch warum, aber vielleicht ist das schon klar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke Sascha nun klappt das auch mit dem wellenspeed.

hab aber trotzdem noch das problem das die arme nicht runter gehen wenn der hubring auf 0 runterfährt.

ein freund meinte es liegt daran weil ich mathe mit physik vermische. verstehe nur noch bahnhof in der sinus sache. ansich sind die arme immer grade der hubring sorgt für die wellenhöhe, falls der aktiviert wurde.

kann ja nur noch ne kleinigkeit sein wofür ich echt zu doof bin lol :D :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alle deine Probleme lassen sich lösen. Zum Beispiel nehmen Trigonometriefunktionen immer Werte in Radians, nicht in Degrees.

Aber ab einem bestimmten Punkt lohnt es sich nicht mehr, sowas zu coden. Stattdessen könntest du eine Animation anfertigen, z.B. mit Unitys Animationsfenster. Da stellst du die Animationskurven einfach selber ein und fertig ist die Sache - dann brauchst du keine Mathematik mehr dafür.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok mit animationen hatte ich mich noch gar nicht befasst.

also muss ich die armpunkte nur neben einander fixieren in diesem animations tool und eine kurve darüber laufen lassen?

wenn das so einfach ist, dann hab ich echt keine worte mehr dafür. werde mir das jetzt aufjedenfall mal schnell angucken und hoffen das ich problemlos damit klar komme.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...