如何让 AI 以类似人类的方式移动
How do I make an AI move in a human-like way
var playerX;
var playerY;
var playerSize = 15;
var playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10;
var Newcelltimer = 0;
var cell = []
var cellEaten = 0;
var celliseaten = false;
var eaten = false;
var zoom = 1;
var n = 0;
var Xgrid = 600;
var Ygrid = 600;
var cpu = [];
function setup() {
frameRate(999)
createCanvas(600, 450);
playerX = Xgrid / 2
playerY = Ygrid / 2;
}
function draw() {
background(220);
push();
var Newzoom = 10 / playerSize
let newnewZoom = 1.3 * lerp(0.9, 10 / playerSize, 0.5)
Newzoom = lerp(zoom, Newzoom, 0.3)
translate(Xgrid / 2, Ygrid / 2 - 50);
scale(newnewZoom)
translate(-playerX, -playerY);
playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10
Newcelltimer++;
for (var i = 0; i < cell.length / 2; i++) {
let d = int(dist(cell[i * 2], cell[i * 2 + 1], playerX, playerY))
if (d <= playerSize / 2) {
playerSize += 5;
cell.splice(i * 2, 2)
celliseaten = true;
}
}
if (keyIsDown(UP_ARROW)) {
playerY -= playerSpeed;
}
if (keyIsDown(RIGHT_ARROW)) {
playerX += playerSpeed;
}
if (keyIsDown(DOWN_ARROW)) {
playerY += playerSpeed;
}
if (keyIsDown(LEFT_ARROW)) {
playerX -= playerSpeed;
}
if (playerX < playerSize / 2 - Xgrid) {
playerX = playerSize / 2 - Xgrid
}
if (playerY < playerSize / 2 - Ygrid) {
playerY = playerSize / 2 - Ygrid
}
if (playerY > 2 * Ygrid - (playerSize / 2)) {
playerY = 2 * Ygrid - (playerSize / 2)
}
if (playerX > 2 * Xgrid - (playerSize / 2)) {
playerX = 2 * Xgrid - (playerSize / 2)
}
if (Newcelltimer % 30 == 0) {
cell.push(ceil(random(0 - Xgrid, 2 * Xgrid)),
ceil(random(0 - Ygrid, 2 * Ygrid)))
}
if (Newcelltimer % 100 == 0) {
cpu.push(random(-Xgrid, 2 * Xgrid), random(-Ygrid, 2 * Ygrid), 20)
}
for (var j = 0; j < cpu.length / 3; j++) {
fill(0, 255, 0, 100);
circle(NewposX,NewposY, cpu[j * 3 + 2])
}
for (var k = 0; k < cell.length / 2; k++) {
fill(0, 255, 255, 100)
circle(cell[k * 2], cell[k * 2 + 1], 7)
}
stroke(0)
fill(255,255,0)
circle(playerX,playerY,playerSize);
if (playerSize >= 3 * Xgrid | playerSize >= 3 * Ygrid) {
if (Xgrid > Ygrid) {
playerSize = 3 * Ygrid;
} else {
playerSize = 3 * Xgrid;
}
}
noFill();
stroke(0, 0, 0)
rect(0 - Xgrid, 0 - Ygrid, 3 * Xgrid, 3 * Ygrid)
pop();
text("Your size is " + playerSize, 20, 20);
}
我如何让编程的单元以类似人类的方式移动,现在,我坚持让它移动,我认为一种方法是使用 Perlin
噪音,但那可能继续强迫它总是一个方向,我可以使用随机,并将该值映射到 degrees/radians
,然后使用 trigonometry
找到路径。尽管如果我不确定 trigonometry
解决方案是什么。
编辑:当我说“以一种更像人类的方式”时,我并不是在谈论任何复杂的事情,只是 AI 不会像这样移动:右、左、右、上、下,左
你的问题有点含糊,但听起来你想做的是给 AI 一个目标 I.E.它想去的某个地方,然后使用一个简单的探路程序让它找出最佳的移动方向
让某物像人一样移动是一项相当复杂的任务!我知道你只是想给一些运动一个自然的外观。 P5的噪音功能是实现这一点最简单的方法。
P5的噪声函数returns一个0到1之间的浮点数,如果直接作用于一个物体的位置,只能使它向正方向移动。尝试使用 map 函数将此输出标准化为 -1 和 1:
map(noise(x, y, z), 0, 1, -1, 1)
将此应用于某种转换,您的智能体将在正向和负向两个方向上移动。
因此,要在 x 轴上移动代理,您可以按照以下方式进行操作:
let amp = 20; // how much you want the agent to move
let offsetX = map(noise, 0, 1, -1, 1) * amp;
ellipse(200 + offsetX, 200, 10, 10);
var playerX;
var playerY;
var playerSize = 15;
var playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10;
var Newcelltimer = 0;
var cell = []
var cellEaten = 0;
var celliseaten = false;
var eaten = false;
var zoom = 1;
var n = 0;
var Xgrid = 600;
var Ygrid = 600;
var cpu = [];
function setup() {
frameRate(999)
createCanvas(600, 450);
playerX = Xgrid / 2
playerY = Ygrid / 2;
}
function draw() {
background(220);
push();
var Newzoom = 10 / playerSize
let newnewZoom = 1.3 * lerp(0.9, 10 / playerSize, 0.5)
Newzoom = lerp(zoom, Newzoom, 0.3)
translate(Xgrid / 2, Ygrid / 2 - 50);
scale(newnewZoom)
translate(-playerX, -playerY);
playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10
Newcelltimer++;
for (var i = 0; i < cell.length / 2; i++) {
let d = int(dist(cell[i * 2], cell[i * 2 + 1], playerX, playerY))
if (d <= playerSize / 2) {
playerSize += 5;
cell.splice(i * 2, 2)
celliseaten = true;
}
}
if (keyIsDown(UP_ARROW)) {
playerY -= playerSpeed;
}
if (keyIsDown(RIGHT_ARROW)) {
playerX += playerSpeed;
}
if (keyIsDown(DOWN_ARROW)) {
playerY += playerSpeed;
}
if (keyIsDown(LEFT_ARROW)) {
playerX -= playerSpeed;
}
if (playerX < playerSize / 2 - Xgrid) {
playerX = playerSize / 2 - Xgrid
}
if (playerY < playerSize / 2 - Ygrid) {
playerY = playerSize / 2 - Ygrid
}
if (playerY > 2 * Ygrid - (playerSize / 2)) {
playerY = 2 * Ygrid - (playerSize / 2)
}
if (playerX > 2 * Xgrid - (playerSize / 2)) {
playerX = 2 * Xgrid - (playerSize / 2)
}
if (Newcelltimer % 30 == 0) {
cell.push(ceil(random(0 - Xgrid, 2 * Xgrid)),
ceil(random(0 - Ygrid, 2 * Ygrid)))
}
if (Newcelltimer % 100 == 0) {
cpu.push(random(-Xgrid, 2 * Xgrid), random(-Ygrid, 2 * Ygrid), 20)
}
for (var j = 0; j < cpu.length / 3; j++) {
fill(0, 255, 0, 100);
circle(NewposX,NewposY, cpu[j * 3 + 2])
}
for (var k = 0; k < cell.length / 2; k++) {
fill(0, 255, 255, 100)
circle(cell[k * 2], cell[k * 2 + 1], 7)
}
stroke(0)
fill(255,255,0)
circle(playerX,playerY,playerSize);
if (playerSize >= 3 * Xgrid | playerSize >= 3 * Ygrid) {
if (Xgrid > Ygrid) {
playerSize = 3 * Ygrid;
} else {
playerSize = 3 * Xgrid;
}
}
noFill();
stroke(0, 0, 0)
rect(0 - Xgrid, 0 - Ygrid, 3 * Xgrid, 3 * Ygrid)
pop();
text("Your size is " + playerSize, 20, 20);
}
我如何让编程的单元以类似人类的方式移动,现在,我坚持让它移动,我认为一种方法是使用 Perlin
噪音,但那可能继续强迫它总是一个方向,我可以使用随机,并将该值映射到 degrees/radians
,然后使用 trigonometry
找到路径。尽管如果我不确定 trigonometry
解决方案是什么。
编辑:当我说“以一种更像人类的方式”时,我并不是在谈论任何复杂的事情,只是 AI 不会像这样移动:右、左、右、上、下,左
你的问题有点含糊,但听起来你想做的是给 AI 一个目标 I.E.它想去的某个地方,然后使用一个简单的探路程序让它找出最佳的移动方向
让某物像人一样移动是一项相当复杂的任务!我知道你只是想给一些运动一个自然的外观。 P5的噪音功能是实现这一点最简单的方法。
P5的噪声函数returns一个0到1之间的浮点数,如果直接作用于一个物体的位置,只能使它向正方向移动。尝试使用 map 函数将此输出标准化为 -1 和 1:
map(noise(x, y, z), 0, 1, -1, 1)
将此应用于某种转换,您的智能体将在正向和负向两个方向上移动。
因此,要在 x 轴上移动代理,您可以按照以下方式进行操作:
let amp = 20; // how much you want the agent to move
let offsetX = map(noise, 0, 1, -1, 1) * amp;
ellipse(200 + offsetX, 200, 10, 10);