Skocz do zawartości
1 maja :: Święto Pracy / 2 maja :: Dzień Flagi / 3 maja :: Święto Konstytucji

[C#] Odtwarzanie dźwięku z określonego wektorem kierunku.


# CSH External VIP Project

Masz dosyć problemów z czynnikiem zaufania w CS2 lub notorycznymi banami?

Sprawdź CSH External VIP Project.


Więcej informacji  

Rekomendowane odpowiedzi

Witojcie, koledzy.

 

Udało mi się zrobić dźwiękowe ESP. Sęk w tym, że jak na razie jedynie pikam intensywnością *beep*ków. Ma ktoś jaki pomysł, aby odtworzyć dźwięk dokładnie w miejscu, gdzie znajduje się przeciwnik? Czyli z pozycji, wektorem. Dość ciekawy temat.

Odnośnik do komentarza

tylko czy world2screen złapie obiekty poza ekranem?

takie true 3d to jest zadanie dla inżynierów dzwięku, ja nawet w stanie sobie nie jestem tego wyobrazic:(

nie prosciej sprawdzac cele blisko gracza, sprawdzac na podstawie viewangles i pozycji przeciwnikow czy sa w prawo czy lewo i puszczac dzwiek % bardziej lewej lub prawej sluchawki w zaleznosci gdzie stoi przeciwnik + glosnosc wieksza im stoi blizej?

Odnośnik do komentarza

1. Mam pozycję SWOJĄ w przestrzeni mapy.
2. Mam pozycję PRZECIWNIKÓW w przestrzeni mapy.

3. Mam kierunek w jaki patrzę.

 

Kombinuję aby na każdy "ping" ESP działo się coś takiego.

- odległość do przeciwnika wyznacza okrąg o promieniu R.

- centrum (słuchaczem) staje się pozycja gracza

- liczę wektor w jakim znajduje się przeciwnik w wyznaczonym okręgu

- wektor jest "wsadem" dla irrklanda

 

Bo ustawiając jako słuchacza vektor gracza i odtwarzając przeciwników z ich wektorów, to słabo to działa. Moze ktos ma lepszy pomysł?


Edytowane przez Tearful
Odnośnik do komentarza

Wydaje mi się, że to ci może pomóc.

 

Służy to do wyświetlania pozycji graczy kiedy ich nie widać i pozwoli ci to na określenie skąd ma być wydany dzwiek przez twoj ping esp.

 

Działa to w taki sposób

 

LTD0Sd1.png

 

CLoat5Q.png

 

 

 

 



void FindPoint(Vector &point, int screenwidth, int screenheight, int degrees) { float x2 = screenwidth / 2; float y2 = screenheight / 2; float d = sqrt(pow((point.x - x2),2) + (pow((point.y - y2),2))); //Distance float r = degrees / d; //Segment ratio point.x = r * point.x + (1 - r) * x2; //find point that divides the segment point.y = r * point.y + (1 - r) * y2; //into the ratio (1-r):r }

 

bool ScreenTransform( const Vector &point, Vector &screen ) { float w; const VMatrix &worldToScreen = g_pEngine->WorldToScreenMatrix(); screen.x = worldToScreen[0][0] * point[0] + worldToScreen[0][1] * point[1] + worldToScreen[0][2] * point[2] + worldToScreen[0][3]; screen.y = worldToScreen[1][0] * point[0] + worldToScreen[1][1] * point[1] + worldToScreen[1][2] * point[2] + worldToScreen[1][3]; w = worldToScreen[3][0] * point[0] + worldToScreen[3][1] * point[1] + worldToScreen[3][2] * point[2] + worldToScreen[3][3]; screen.z = 0.0f; bool behind = false; if( w < 0.001f ){ behind = true; float invw = -1.0f / w; screen.x *= invw; screen.y *= invw; } else{ behind = false; float invw = 1.0f / w; screen.x *= invw; screen.y *= invw; } return behind; }

 

bool WorldToScreen( const Vector &vOrigin, Vector &vScreen ) { bool st = ScreenTransform(vOrigin, vScreen); int iScreenWidth, iScreenHeight; g_pEngine->GetScreenSize( iScreenWidth, iScreenHeight ); float x = iScreenWidth / 2; float y = iScreenHeight / 2; x += 0.5 * vScreen.x * iScreenWidth + 0.5; y -= 0.5 * vScreen.y * iScreenHeight + 0.5; vScreen.x = x; vScreen.y = y; if(vScreen.x > iScreenHeight || vScreen.x < 0 || vScreen.y > iScreenWidth || vScreen.y < 0 || st) { FindPoint(vScreen, iScreenWidth, iScreenHeight, iScreenHeight/2); return false; } return true; }

 

if(WorldToScreen(...) { //Point is On Screen, Draw it like normal. } else { //Point is OffScreen. WorldToScreen(pBaseEnt->GetAbsOrigin() + Vector(0, 0, 72), vecTop); WorldToScreen(pBaseEnt->GetAbsOrigin(), vecBottom); if(pBaseEnt->GetTeamNumber() == 3) DrawLine(vecTop.x, vecBottom.x, vecTop.y, vecBottom.y, 0, 0, 255, 255); else if(pBaseEnt->GetTeamNumber() == 2) DrawLine(vecTop.x, vecBottom.x, vecTop.y, vecBottom.y, 255, 0, 0, 255); } //Then I call it like this, drawing a line from point A(top of player) to point B(bottom of player). //This makes the line show distance from how far away you are to the postion.

Odnośnik do komentarza
14 godzin temu, krzychu1 napisał:

" to słabo to działa " co to znaczy

Jestem jeszcze na etapie testowania. Jeśli jako centrum ustawię gracza, podam jako 'wejscie' wektor z polozeniem przeciwnika i trzeci ze zwrotem gracza, to dźwięk i tak brzmi bardzo randomowo.

 

Ale przykładowa implementacja, która porusza dźwiękiem po okręgu działa bardzo dobrze, więc najprościej będzie zrobić to tak samo. (To biblioteka Irrkland, którą polecił wiotq)

float posOnCircle = 0;

Vector3D pos3d = new Vector3D(radius * (float)Math.Cos(posOnCircle), 0,
                                              radius * (float)Math.Sin(posOnCircle * 0.5f));

 

ten wektor podajemy jako parametr i callujemy .Play().

 

posOnCircle mozna sobie inkrementować i słyszmy jak dźwięk się krąży.


Edytowane przez wunderwafe
Odnośnik do komentarza

Gra sama w sobie i tak słabo radzi sobie z dźwiękiem góra/dół. Zawsze moge wyznaczyc kulę 😄 ale do rozpoznania góra/dół moge po prostu użyć 2ch dźwięków, aż takiej dokładności nie porzebujemy.

 

Będę kombinował w niedzielę/poniedziałek, to zobaczymy co z tego wyniknie :)

Odnośnik do komentarza

bumpik bo niedlugo tez sie za to zabieram

ale ja bede miec lepiej:)

bo robie w node.

https://github.com/goldfire/howler.js/#posx-y-z-id

https://howlerjs.com/#spatial

ogolnie z tym to bajecznie dokladne i proste: biore koordynaty xyz przeciwnikow, moje, kierunek w jaki patrza i patrze, daje to do biblioteki i mam pr000 3d sesp

no i jeszcze dystans, zeby ustalac dystans, takie bajery

Odnośnik do komentarza

Na pewno potrzebujesz pozycji przeciwników,  swojej pozycji oraz swojego kątu viewangles. Następnie liczysz odległość między Twoja pozycja a pozycja przeciwnika, sprawdzasz czy spełnia jakies kryterium, jeśli tak to dźwięk puszczasz głośno proporcjonalnie do tego jak blisko jest przeciwnik, potem na podstawie swoich katów widzenia, pozycji swojej i przeciwnika musisz wyznaczyć pod jakim kątem powinien byc puszczony, potem jeszcze będziesz musiał wziąć pod uwagę wysokość na której się przeciwnik znajduje, tutaj głównie chodzi o matematykę. 

To co prawda JavaScript, ale nie znam łatwiejszego sposobu żeby to wyjaśnić. Biblioteka jest z powodzeniem używana do odtwarzania dźwięku 3D np. dla gier przeglądarkę.

https://github.com/goldfire/howler.js/blob/master/README.md#plugin-spatial

 

+ praktyczne zastosowanie, demo:

https://github.com/goldfire/howler.js/tree/master/examples/3d

Odnośnik do komentarza

Na razie mam jeszcze mały problem z ViewAngles i wektorem zwrotu gracza, ale jakoś powinienem sobei z tym niedługo poradzić. Gorzej, że bilblioteka irrKland, której próbuje używać, dość słabo odtrwarza przód/tył (ale to na razie próbuję ominąć używająć dwóch różnych dźwięków). Myślę, że do niedzieli powinno byc już dobrze.


Edytowane przez Tearful
Odnośnik do komentarza

o to spoko, jak cos to pisz pw ja tez bede pisal pw niekoniecznie tutaj

wstawimy finalny wynik

ja mam juz logike ogarnieta tylko robie teraz playerliste i dopiero potem to. powinno byc bardzo w porzadku ew doucze sie

a cala literature podlinkuje ^o tu

BTWW ja to robgie na pewno inaczej ale tobie moze pomoc raczej:

https://developer.valvesoftware.com/wiki/Sound_In_Code

BTWWWW https://valvesoftware.github.io/steam-audio/doc/capi/page_quickstart.html

Odnośnik do komentarza

a ja już to ogarnąłem xD

znaczy mam pewne problemy jeszcze, ale to do fixnięcia

koncept:

bierzesz origin wszystkich przeciwników, a następnie wszystkich rotujesz tak, żeby local entity było w środku;

private static Vector2 RotatePoint(Vector2 pointToRotate, Vector2 centerPoint, float angle, bool angleInRadians = false)
{
if(!angleInRadians)
angle = (float)(angle * (Math.PI / 180f));
float cosTheta = (float)Math.Cos(angle);
float sinTheta = (float)Math.Sin(angle);
Vector2 returnVec = new Vector2(
cosTheta * (pointToRotate.X - centerPoint.X) - sinTheta * (pointToRotate.Y - centerPoint.Y),
sinTheta * (pointToRotate.X - centerPoint.X) + cosTheta * (pointToRotate.Y - centerPoint.Y)
);
returnVec += centerPoint;
return returnVec;
}

pasted z uc, to akurat wpisz sobie "How to implement a simple radar", gosc krok po kroku tlumaczy jak zrobic radar i wpadlem na pomysl zeby wziac ta funkcje i rzeczywiscie trafilem w sedno. 

juz wrzucam na yt, generalnie jesli musisz external to robisz na innym sdku bo te to jakas lipa, a jak internal to chwila re i masz idealny sound esp jak dzwieki w grze

z rezultatu zadowolony nei jestem, ale to wiadomo dopiero pierwszy prototyp i jeszcze bedzie dograne ladnie. tylko wlasnie teraz probuje zrozumiec jak powinienem postepowac z tymi wektorami

Odnośnik do komentarza

@predator-rc

 

No i widzisz, masz podobny problem. Ten dźwęk też jest niestety totalnie z dupy (kierunku wydają się być randomowe). Tutaj kluczem jest chyba jednak odpowiednio reagująca biblioteka. A druga rzecz jest taka, że dźwięk jeśli trwa np. 2 sekundy, to w trakcie jego trwania wektor musi być aktualizowany, a nie odtwarzać się do końca w swoim miejscu początkowym. Sam CS tak robi jeśli niesie się dźwięk będący w ruchu. 

Odnośnik do komentarza
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Regulamin. Polityka prywatności