Я пытаюсь создать компонент чернильных знаков для игры, которую делаю. Я хочу, чтобы оно было 2D, но с «3D-эффектом», чтобы выглядело так, будто вы смотрите на него с высоты птичьего полета. Я также хочу, чтобы чернильные пятна каждый раз выглядели немного по-разному.
Вот эталонное изображение (зеленый чернильный знак в левом верхнем углу):
https://www.shutterstock.com/image-vect ... 2531263139
Я пытался использовать ИИ, но ни Близнецы, ни Клод не могли понять, как это сделать. Это мой текущий код для моего компонента «чернильный знак», он строго 2D и совсем не похож на зеленый код на изображении:
import { useMemo, type CSSProperties} from 'react';
import { useColor } from './ColorContext';
// Define the shape of the props for TypeScript
interface InkSplatProps {
size?: number;
color?: string;
style?: CSSProperties;
}
export default function InkSplat({ color, style }: InkSplatProps) {
const { activeColor } = useColor();
const displayColor = color || activeColor;
const internalSize = 100;
const { mainPath, droplets } = useMemo(() => {
const center = internalSize / 2;
const points = 14; // More points = more detail
const angleStep = (Math.PI * 2) / points;
const pathData = [];
const dots = [];
// 1. Generate the Main Splat Body
for (let i = 0; i 0.6;
const baseRadius = internalSize * (isSpike ? 0.35 : 0.2);
const randomRadius = baseRadius + Math.random() * (internalSize * 0.15);
const x = center + Math.cos(angle) * randomRadius;
const y = center + Math.sin(angle) * randomRadius;
if (i === 0) {
pathData.push(`M ${x} ${y}`);
} else {
const prevAngle = (i - 1) * angleStep;
// Increase ctrlRadius to make the curves more "liquid" and dramatic
const ctrlRadius = randomRadius * (1.5 + Math.random() * 0.5);
const cx = center + Math.cos(prevAngle + angleStep / 2) * ctrlRadius;
const cy = center + Math.sin(prevAngle + angleStep / 2) * ctrlRadius;
pathData.push(`Q ${cx} ${cy} ${x} ${y}`);
}
}
// 2. Generate Small Satellite Droplets
for (let j = 0; j < 5; j++) {
const dotAngle = Math.random() * Math.PI * 2;
const dotDistance =
(internalSize * 0.35) + Math.random() * (internalSize * 0.15);
dots.push({
cx: center + Math.cos(dotAngle) * dotDistance,
cy: center + Math.sin(dotAngle) * dotDistance,
r: 1 + Math.random() * 2, // Tiny varied sizes
});
}
return { mainPath: pathData.join(' ') + ' Z', droplets: dots };
}, [internalSize]);
return (
style={{
display: 'flex',
aspectRatio: '1 / 1',
justifyContent: 'center',
alignItems: 'center',
width: '100%',
...style
}}
>
{droplets.map((dot, i) => (
))}
);
};
Подробнее здесь: https://stackoverflow.com/questions/798 ... -3d-effect
Как создать чернильный след с помощью реакции, имеющей 3D-эффект? ⇐ Javascript
Форум по Javascript
-
Anonymous
1772172596
Anonymous
Я пытаюсь создать компонент чернильных знаков для игры, которую делаю. Я хочу, чтобы оно было 2D, но с «3D-эффектом», чтобы выглядело так, будто вы смотрите на него с высоты птичьего полета. Я также хочу, чтобы чернильные пятна каждый раз выглядели немного по-разному.
Вот эталонное изображение (зеленый чернильный знак в левом верхнем углу):
https://www.shutterstock.com/image-vector/colorful-splatters-dependent-shapes-abstract-stains-2531263139
Я пытался использовать ИИ, но ни Близнецы, ни Клод не могли понять, как это сделать. Это мой текущий код для моего компонента «чернильный знак», он строго 2D и совсем не похож на зеленый код на изображении:
import { useMemo, type CSSProperties} from 'react';
import { useColor } from './ColorContext';
// Define the shape of the props for TypeScript
interface InkSplatProps {
size?: number;
color?: string;
style?: CSSProperties;
}
export default function InkSplat({ color, style }: InkSplatProps) {
const { activeColor } = useColor();
const displayColor = color || activeColor;
const internalSize = 100;
const { mainPath, droplets } = useMemo(() => {
const center = internalSize / 2;
const points = 14; // More points = more detail
const angleStep = (Math.PI * 2) / points;
const pathData = [];
const dots = [];
// 1. Generate the Main Splat Body
for (let i = 0; i 0.6;
const baseRadius = internalSize * (isSpike ? 0.35 : 0.2);
const randomRadius = baseRadius + Math.random() * (internalSize * 0.15);
const x = center + Math.cos(angle) * randomRadius;
const y = center + Math.sin(angle) * randomRadius;
if (i === 0) {
pathData.push(`M ${x} ${y}`);
} else {
const prevAngle = (i - 1) * angleStep;
// Increase ctrlRadius to make the curves more "liquid" and dramatic
const ctrlRadius = randomRadius * (1.5 + Math.random() * 0.5);
const cx = center + Math.cos(prevAngle + angleStep / 2) * ctrlRadius;
const cy = center + Math.sin(prevAngle + angleStep / 2) * ctrlRadius;
pathData.push(`Q ${cx} ${cy} ${x} ${y}`);
}
}
// 2. Generate Small Satellite Droplets
for (let j = 0; j < 5; j++) {
const dotAngle = Math.random() * Math.PI * 2;
const dotDistance =
(internalSize * 0.35) + Math.random() * (internalSize * 0.15);
dots.push({
cx: center + Math.cos(dotAngle) * dotDistance,
cy: center + Math.sin(dotAngle) * dotDistance,
r: 1 + Math.random() * 2, // Tiny varied sizes
});
}
return { mainPath: pathData.join(' ') + ' Z', droplets: dots };
}, [internalSize]);
return (
style={{
display: 'flex',
aspectRatio: '1 / 1',
justifyContent: 'center',
alignItems: 'center',
width: '100%',
...style
}}
>
{droplets.map((dot, i) => (
))}
);
};
Подробнее здесь: [url]https://stackoverflow.com/questions/79897490/how-do-i-design-a-ink-splat-using-react-that-has-a-3d-effect[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия