[ЗАДАЧА] Создание обводки вокруг параллелепипеда - Форум
Заказать Сервер Платные SourceMod Плагины Контакты Поиск

Counter-Strike Source + 2 GAMES
Grand Theft Auto V
DARK SOULS III
другие игры [ дешевле, чем в стиме ]

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки/Советы/Задачки от Пользователей » [ЗАДАЧА] Создание обводки вокруг параллелепипеда
[ЗАДАЧА] Создание обводки вокруг параллелепипеда
BarD Дата: Суббота, 11.06.2016, 11:40:22 | Сообщение # 1
Сообщений: 946
Репутация: 131 [ +/- ]
У нас есть параллелепипед. В нем известны только длины сторон и координата середины нижнего основания. Задача: "обрисовать" все его ребра.

Для обрисовки используйте вымышленную функцию:
Код
CreateBeam(Float:pos1[2], Float:pos2[3]) //Рисует линию от точки pos1 до точки pos2


Данные для задачи:
Код


new Float:size[3], Float:center[3];
size[0] = GetRandomFloat(10.0, 100.0);
size[1] = GetRandomFloat(10.0, 100.0);
size[2] = GetRandomFloat(10.0, 100.0);

center[0] = GetRandomFloat(-1000.0, 1000.0);
center[1] = GetRandomFloat(-1000.0, 1000.0);
center[2] = GetRandomFloat(-1000.0, 1000.0);


Решение знаю :) Интересно, как решите вы :)


Прикрепления: 1048288.png(28Kb)


Сообщение отредактировал BarD - Суббота, 11.06.2016, 11:59:56
 
хвостег Дата: Суббота, 11.06.2016, 21:59:48 | Сообщение # 2
Сообщений: 162
Репутация: 53 [ +/- ]
Код
#include <sdktools>

new g_Texture = -1;

public OnMapStart()
{
    g_Texture = PrecacheModel("materials/sprites/laser.vmt");
}

public OnPluginStart()
{
    RegConsoleCmd("sm_cbtest", CMD_Cube);
}

public Action:CMD_Cube(client, args)
{
    new Float:pos[3], Float:size[3];
    GetClientAbsOrigin(client, pos);
    
    size[0] = GetRandomFloat(10.0, 100.0);
    size[1] = GetRandomFloat(10.0, 100.0);
    size[2] = GetRandomFloat(10.0, 100.0);
    Cube(size, pos, g_Texture, 3.0);
    
    size[0] = GetRandomFloat(10.0, 100.0);
    size[1] = GetRandomFloat(10.0, 100.0);
    size[2] = GetRandomFloat(10.0, 100.0);
    
                    //pith  yaw  roll
    CubeRotate(size, pos, Float:{10.0,20.0,30.0}, g_Texture, 3.0);
    return Plugin_Handled;
}

stock Line(const clients[], numClients, const Float:start[3], const Float:end[3], texture, Float:life, const color[4]) {
    TE_SetupBeamPoints(start, end, texture, 0, 0, 0, life, 3.0, 3.0, 0, 0.0, color, 10);
    TE_Send(clients, numClients);
}

stock Cube(const Float:size[3], const Float:pos[3], texture, Float:life, const color[4] = {255,...}) { // обычный
    new total = 0;
    new clients[MaxClients+1];
    
    for(new i = 1; i <= MaxClients; i++) {
        if(IsClientInGame(i))
            clients[total++] = i;
    }
    
    decl Float:points[8][3];
    points[0][0] = pos[0] - size[0] * 0.5;
    points[0][1] = pos[1] - size[1] * 0.5;
    points[0][2] = pos[2];
    
    AddVectors(points[0], size, points[4]);
    
    for(new i = 1; i < 4; i++) {
        points[i]   = points[0];
        points[i+4] = points[4];
    }
    
    points[1][0] = points[4][0];
    points[2][0] = points[4][0]; points[2][1] = points[4][1];
    points[3][1] = points[4][1];
    
    points[4][0] = points[0][0]; points[4][1] = points[0][1];
    points[5][1] = points[0][1];
    points[7][0] = points[0][0];
    
    for(new i = 0; i < 4; i++) {
        Line(clients, total, points[i], points[i+4], texture, life, color);
        Line(clients, total, points[i], points[(i+1)%4], texture, life, color);
        Line(clients, total, points[i+4], points[(i+1)%4+4], texture, life, color);
    }
}

stock CubeRotate(const Float:size[3], Float:pos[3], const Float:angles[3], texture, Float:life, const color[4] = {255,...}) { // вращаемый
    new total = 0;
    new clients[MaxClients+1];
    
    for(new i = 1; i <= MaxClients; i++) {
        if(IsClientInGame(i))
            clients[total++] = i;
    }
    
    pos[2] += size[2] * 0.5;
    
    decl Float:points[8][3];
    points[0] = size;
    points[4] = size;
    ScaleVector(points[0], -0.5);
    ScaleVector(points[4],  0.5);
    
    for(new i = 1; i < 4; i++) {
        points[i]   = points[0];
        points[i+4] = points[4];
    }
    
    points[1][0] = points[4][0];
    points[2][0] = points[4][0]; points[2][1] = points[4][1];
    points[3][1] = points[4][1];
    
    points[4][0] = points[0][0]; points[4][1] = points[0][1];
    points[5][1] = points[0][1];
    points[7][0] = points[0][0];
    
    for(new i = 0; i < 8; i++) {
        RotateVector(points[i], angles);
        AddVectors(points[i], pos, points[i]);
    }
    
    for(new i = 0; i < 4; i++) {
        Line(clients, total, points[i], points[i+4], texture, life, color);
        Line(clients, total, points[i], points[(i+1)%4], texture, life, color);
        Line(clients, total, points[i+4], points[(i+1)%4+4], texture, life, color);
    }
}

//https://ru.wikipedia.org/wiki/Матрица_поворота
stock RotateVector(Float:vec[3], const Float:angle[3]) {
    decl Float:radang[3], Float:temp, Float:vsin, Float:vcos;
    for(new i = 0; i < 3; i++)
        radang[i] = DegToRad(angle[(i+2)%3]);
    
    vsin = Sine(radang[0]);
    vcos = Cosine(radang[0]);
    temp   = vec[1] * vcos - vec[2] * vsin;
    vec[2] = vec[2] * vcos + vec[1] * vsin;
    vec[1] = temp;
    
    vsin = Sine(radang[1]);
    vcos = Cosine(radang[1]);
    temp   = vec[0] * vcos + vec[2] * vsin;
    vec[2] = vec[2] * vcos - vec[0] * vsin;
    vec[0] = temp;
    
    vsin = Sine(radang[2]);
    vcos = Cosine(radang[2]);
    temp   = vec[0] * vcos - vec[1] * vsin;
    vec[1] = vec[1] * vcos + vec[0] * vsin;
    vec[0] = temp;
}

Прикрепления: cube.sp(4Kb)


Сообщение отредактировал хвостег - Воскресенье, 12.06.2016, 04:42:30
 
BarD Дата: Воскресенье, 12.06.2016, 11:44:50 | Сообщение # 3
Сообщений: 946
Репутация: 131 [ +/- ]
хвостег, круто)





Прикрепления: 4367517.png(38Kb) · 0082069.jpg(459Kb)


Сообщение отредактировал BarD - Воскресенье, 12.06.2016, 12:16:38
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки/Советы/Задачки от Пользователей » [ЗАДАЧА] Создание обводки вокруг параллелепипеда
Страница 1 из 11
Поиск: