728x90

์•ž์„  ๊ฐœ๋…

 

Velocity Obstacle(VO)๋ž€?

๋…ผ๋ฌธ ์ฐธ๊ณ  : Motion Planning in Dynamic Environments using Velocity Obstacles - 1998๋…„๋„ ๋ฐœํ–‰ ๋…ผ๋ฌธ์˜ ํ•ต์‹ฌ ๋‚ด์šฉ- ์†๋„ ์žฅ์• ๋ฌผ์€ ๋ฐ”๋€Œ๋Š” ์‹œ๊ฐ„ ํ™˜๊ฒฝ์„ ์œ„ํ•œ configuration space obstacle์˜ ํ™•์žฅ ๊ฐœ๋…์ด๋‹ค. ์ฆ‰ ์‹ค์‹œ๊ฐ„ ํ™˜๊ฒฝ์—

dana3711.tistory.com


์ƒˆ๋กœ์šด ๊ฐœ๋…์ธ Reciprocal Velocity Obstacle(์ดํ•˜ RVO)๋ฅผ ์ œ์•ˆํ•จ
๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ์™€ ๋ช…์‹œ์ ์œผ๋กœ ํ†ต์‹ ํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์›€์ง์ด๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•จ

๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์ด ์œ ์‚ฌํ•œ ์ถฉ๋Œ ํšŒํ”ผ ์ถ”๋ก ์„ ์•”๋ฌต์ ์œผ๋กœ ๊ฐ€์ •ํ•จ์œผ๋กœ์จ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋ฐ˜์‘์  ํ–‰๋™์„ ๊ณ ๋ คํ•จ
์ •์  ์žฅ์• ๋ฌผ๊ณผ ์ด๋™ ์žฅ์• ๋ฌผ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ์ธ๊ตฌ ๋ฐ€๋„๊ฐ€ ๋†’์€ ํ™˜๊ฒฝ์—์„œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์—์ด์ „ํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์— ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ณ , ๋„์ „์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‹ค์‹œ๊ฐ„ ๋ฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์คŒ
์‚ฌ์šฉํ•˜๋Š” ORCA ๊ฐœ๋…์˜ ๊ฒฝ์šฐ ๋กœ๋ณดํ‹ฑ์Šค์—์„œ ๋กœ๋ด‡๊ฐ„์˜ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋„ ์“ฐ์ž„

 

์ˆ˜์ •ํ•˜๊ณ ์ž ํ•œ ๊ฒƒ

Velocity Obstacle(VO)์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ง„๋™ํ˜„์ƒ์„ ์ˆ˜์ •ํ•˜๊ณ ์ž ์ œ์ž‘ํ•จ

 

ํ•ต์‹ฌ ๋‚ด์šฉ

์›€์ง์ด๋Š” ์žฅ์• ๋ฌผ๋“ค ์‚ฌ์ด์—์„œ์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์›€์ง์ž„์„ ์œ„ํ•ด ๋„์ž…๋œ VO(Velocity Obstacle) ๊ฐœ๋…์˜ ํ™•์žฅ

ORCA(Optimal Reciprocal Collision Avoidance)๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ•˜์—ฌ ๊ฐ ๊ฐ์ฒด๊ฐ„์˜ ์†๋„๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„ ๊ทธ ์ฑ…์ž„์„ ๊ฐ๊ฐ ๋ฐ˜ํ‹ˆ์”ฉ ๊ฐ€์ง€๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๊ตฐ์ค‘์˜ ๋ญ‰์น˜๋Š” ํ˜„์ƒ์„ ์ค„์–ด๋“ค๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ

๊ฒฐ๊ตญ ๋ณ‘๋ชฉ ํ˜„์ƒ(Bottleneck)์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ œ์ž‘

 

- ๋ฏผ์ฝ”์šฐ์Šคํ‚ค ํ•ฉ (๋ฏผ์ฝ”ํ”„์Šคํ‚ค ๋ง์…ˆ)

๊ธฐํ•˜ํ•™์—์„œ, ์œ ํด๋ฆฌ๋“œ ๊ณต๊ฐ„์˜ ์œ„์น˜๋ฒกํ„ฐ A์™€ B์˜ ๋‘ ์ง‘ํ•ฉ์˜ ๋ฏผ์ฝ”์Šคํ‚ค ํ•ฉ(ํŒฝ์ฐฝ)์€ A์— ์žˆ๋Š” ๋ชจ๋“  ๋ฒกํ„ฐ๋ฅผ B์— ์žˆ๋Š” ๊ฐ๊ฐ์˜ ๋ฒกํ„ฐ์— ๋”ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค.
 

 
 
๋ฏผ์ฝ”ํ”„์Šคํ‚ค ๋ง์…ˆ์€ ์žฅ์• ๋ฌผ ์‚ฌ์ด๋กœ ์ง€๋‚˜๋Š” ๋ชจ์…˜๊ณ„ํš์— ์‚ฌ์šฉ๋œ๋‹ค.

 

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ

 

Minkowski sum of convex polygons - Algorithms for Competitive Programming

Minkowski sum of convex polygons Definition Consider two sets $A$ and $B$ of points on a plane. Minkowski sum $A + B$ is defined as $\{a + b| a \in A, b \in B\}$. Here we will consider the case when $A$ and $B$ consist of convex polygons $P$ and $Q$ with t

cp-algorithms.com

 

๋ฏผ์ฝ”ํ”„์Šคํ‚ค ๋ง์…ˆ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ๋นจ๊ฐ„ ๋„ํ˜•์€ ํŒŒ๋ž€ ๋„ํ˜•๊ณผ ์ดˆ๋ก์ƒ‰ ๋„ํ˜•์˜ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ๋ง์…ˆ์ด๋‹ค. ๊ธฐํ•˜ํ•™์—์„œ, ์œ ํด๋ฆฌ๋“œ ๊ณต๊ฐ„์˜ ์œ„์น˜๋ฒกํ„ฐ A์™€ B์˜ ๋‘ ์ง‘ํ•ฉ์˜ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ํ•ฉ(ํŒฝ์ฐฝ์ด๋ผ๊ณ ๋„ ์•Œ๋ ค์ ธ

ko.wikipedia.org

 

 

์‹ค์ œ ์ž‘๋™ RVO2 Library

๐Ÿ’กRVOSimulator-> doStep()

 

doStep์„ ์‹คํ–‰ํ•˜๋ฉด ํ•œํ”„๋ ˆ์ž„์ด ์ง„ํ–‰๋œ๋‹ค.

void RVOSimulator::doStep(float powfScalar)
{
    kdTree_->buildAgentTree();

    this->powfScalar = powfScalar;

#ifdef _OPENMP
#pragma omp parallel for
#endif
    for (int i = 0; i < static_cast<int>(agents_.size()); ++i) {
        agents_[i]->computeNeighbors();
        agents_[i]->computeNewVelocity();
        //agents_[i]->computeNewVelocityE();
    }

#ifdef _OPENMP
#pragma omp parallel for
#endif
    for (int i = 0; i < static_cast<int>(agents_.size()); ++i) {
        agents_[i]->update();
    }

    globalTime_ += timeStep_;
}

 

๋จผ์ € kdTree์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๋‹ค์‹œ ์ƒ์„ฑํ•œ๋‹ค.

void KdTree::buildAgentTree()
{
	if (agents_.size() < sim_->agents_.size()) {
		for (size_t i = agents_.size(); i < sim_->agents_.size(); ++i) {
			agents_.push_back(sim_->agents_[i]);
		}

		agentTree_.resize(2 * agents_.size() - 1);
	}

	if (!agents_.empty()) {
		buildAgentTreeRecursive(0, agents_.size(), 0);
	}
}

 

ํ˜„์žฌ agent์˜ ์ˆ˜์™€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” agent์˜ ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ (์ฆ‰, ์ถ”๊ฐ€๋  ๋•Œ) ์ƒˆ๋กœ์šด agent๋ฅผ vector์— ์ถ”๊ฐ€ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Agent kd-tree๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

void KdTree::buildAgentTreeRecursive(size_t begin, size_t end, size_t node)
{
	agentTree_[node].begin = begin;
	agentTree_[node].end = end;
	agentTree_[node].minX = agentTree_[node].maxX = agents_[begin]->position_.x();
	agentTree_[node].minY = agentTree_[node].maxY = agents_[begin]->position_.y();

	for (size_t i = begin + 1; i < end; ++i) {
		agentTree_[node].maxX = std::max(agentTree_[node].maxX, agents_[i]->position_.x());
		agentTree_[node].minX = std::min(agentTree_[node].minX, agents_[i]->position_.x());
		agentTree_[node].maxY = std::max(agentTree_[node].maxY, agents_[i]->position_.y());
		agentTree_[node].minY = std::min(agentTree_[node].minY, agents_[i]->position_.y());
	}

	if (end - begin > MAX_LEAF_SIZE) {
		/* No leaf node. (leaf node : ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ์ตœ์ƒ์œ„ ๋…ธ๋“œ) */
		const bool isVertical = (agentTree_[node].maxX - agentTree_[node].minX > agentTree_[node].maxY - agentTree_[node].minY);
		const float splitValue = (isVertical ? 0.5f * (agentTree_[node].maxX + agentTree_[node].minX) : 0.5f * (agentTree_[node].maxY + agentTree_[node].minY));

		size_t left = begin;
		size_t right = end;

		while (left < right) {
			while (left < right && (isVertical ? agents_[left]->position_.x() : agents_[left]->position_.y()) < splitValue) {
				++left;
			}

			while (right > left && (isVertical ? agents_[right - 1]->position_.x() : agents_[right - 1]->position_.y()) >= splitValue) {
				--right;
			}

			if (left < right) {
				std::swap(agents_[left], agents_[right - 1]);
				++left;
				--right;
			}
		}

		if (left == begin) {
			++left;
			++right;
		}

		agentTree_[node].left = node + 1;
		agentTree_[node].right = node + 2 * (left - begin);

		buildAgentTreeRecursive(begin, left, agentTree_[node].left);
		buildAgentTreeRecursive(left, end, agentTree_[node].right);
	}
}

 

 

๐Ÿ’กAgent -> computeNeighbors()

void Agent::computeNeighbors()
{
	obstacleNeighbors_.clear();
	float rangeSq = sqr(timeHorizonObst_ * maxSpeed_ + radius_);
	sim_->kdTree_->computeObstacleNeighbors(this, rangeSq);

	agentNeighbors_.clear();

	if (maxNeighbors_ > 0) {
		rangeSq = sqr(neighborDist_);
		sim_->kdTree_->computeAgentNeighbors(this, rangeSq);
	}
}

 

๋จผ์ € Agent์˜ ์ด์›ƒ๋“ค(๋‚˜๋ž‘ ๊ฐ™์ด ์›€์ง์ด๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” Agent๋“ค์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ํ•œ๋‹ค.

rangeSq๋Š” ์†๋„์™€ timeHorizonObst(์˜ต์…˜)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋„๋ก ๋งŒ๋“  sqr(๋ฃจํŠธ)๋ฅผ ์ ์šฉํ•œ ๋ฐ˜์ง€๋ฆ„์ด๋‹ค.

ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ kdTree->computeAgentNeighbors() ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

์ด์ค‘์— RVO๋Š” Nearest Neighbor ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๋“ฏํ•˜๋‹ค.

computeObstacleNeighbors๋Š” ์›€์ง์ด์ง€ ์•Š๋Š” ๋ฐฉํ•ด๋ฌผ์„ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๊ณ„์‚ฐํ•œ๋‹ค.

๐Ÿ’กk-d Tree
k์ฐจ์› ๊ณต๊ฐ„์˜ ์ ๋“ค์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ณต๊ฐ„ ๋ถ„ํ•  ์ž๋ฃŒ ๊ตฌ์กฐ
๋ณดํ†ต ๋‹ค์ฐจ์› ๊ณต๊ฐ„์—์„œ ํƒ์ƒ‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฒ•
Range Search, Nearest neighbor ๋“ฑ์˜ ๋ฌธ์ œ์— ์ ์šฉ
๐Ÿ’กkNN
์ฃผ์–ด์ง„ Point์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด(์ฃผ์–ด์ง„ set์•ˆ์˜) ์ ์„ ์ฐพ๋Š” ๊ฒƒ

1. k ์ด์›ƒ์˜ ๊ธฐ์ค€์„ ์ •์˜
2. test ์…‹์˜ ๊ฐœ๋ณ„ ํฌ์ธํŠธ์— ๋Œ€ํ•ด์„œ k ๊ฐœ์˜ ์ด์›ƒ์„ ์ฐพ์Œ
3. ์ด์›ƒ์˜ output์„ ๊ฐ€์ง€๊ณ  ์˜ˆ์ธก๊ฐ’์„ ์ƒ์„ฑ

 

void KdTree::computeAgentNeighbors(Agent *agent, float &rangeSq) const
{
    queryAgentTreeRecursive(agent, rangeSq, 0);
}

 

kd-tree ๋‚ด์—์„œ ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ insertํ•ด์ค€๋‹ค.

์ฐพ์€ agentTree๊ฐ€ 10๊ฐœ ์ดํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด kd-tree ๋‚ด์—์„œ ์œ„์น˜๋ฅผ ๋‹ค์‹œ ์ •ํ™•ํ•˜๊ฒŒ ํƒ์ƒ‰ํ•œ๋‹ค.

kNN์—์„œ ์ฃผ์–ด์ง„ set์ด 10๊ฐœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

void KdTree::queryAgentTreeRecursive(Agent *agent, float &rangeSq, size_t node) const
{
	//agentTree์˜ ํฌ๊ธฐ๊ฐ€ 10๋ณด๋‹ค ์ž‘๋‹ค๋ฉด agent์˜ ์ด์›ƒ์— ํ•ด๋‹น agent๋ฅผ insert
	if (agentTree_[node].end - agentTree_[node].begin <= MAX_LEAF_SIZE) {
		for (size_t i = agentTree_[node].begin; i < agentTree_[node].end; ++i) {
			agent->insertAgentNeighbor(agents_[i], rangeSq);
		}
	}
	else {
		const float distSqLeft = sqr(std::max(0.0f, agentTree_[agentTree_[node].left].minX - agent->position_.x())) + sqr(std::max(0.0f, agent->position_.x() - agentTree_[agentTree_[node].left].maxX)) + sqr(std::max(0.0f, agentTree_[agentTree_[node].left].minY - agent->position_.y())) + sqr(std::max(0.0f, agent->position_.y() - agentTree_[agentTree_[node].left].maxY));

		const float distSqRight = sqr(std::max(0.0f, agentTree_[agentTree_[node].right].minX - agent->position_.x())) + sqr(std::max(0.0f, agent->position_.x() - agentTree_[agentTree_[node].right].maxX)) + sqr(std::max(0.0f, agentTree_[agentTree_[node].right].minY - agent->position_.y())) + sqr(std::max(0.0f, agent->position_.y() - agentTree_[agentTree_[node].right].maxY));

		if (distSqLeft < distSqRight) {
			if (distSqLeft < rangeSq) {
				queryAgentTreeRecursive(agent, rangeSq, agentTree_[node].left);

				if (distSqRight < rangeSq) {
					queryAgentTreeRecursive(agent, rangeSq, agentTree_[node].right);
				}
			}
		}
		else {
			if (distSqRight < rangeSq) {
				queryAgentTreeRecursive(agent, rangeSq, agentTree_[node].right);

				if (distSqLeft < rangeSq) {
					queryAgentTreeRecursive(agent, rangeSq, agentTree_[node].left);
				}
			}
		}

	}
}

 

๐Ÿ’กAgent -> computeNewVelocity()

 

์ฃผ๋ณ€ ์ด์›ƒ์„ ๊ฒฐ์ •ํ•˜์˜€์œผ๋ฉด ์ƒˆ๋กœ์šด ์†๋„๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

์ƒˆ๋กœ์šด ์†๋„๋ฅผ ์œ„ํ•ด ORCA ๋ผ์ธ์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ ๋‹ค.

ํ–‰๋ ฌ์‹์˜ ์ ˆ๋Œ€๊ฐ’์€ ๋„ํ˜•์˜ ๋ฉด์ ์„ ์˜๋ฏธํ•œ๋‹ค.

 

		const Obstacle *obstacle1 = obstacleNeighbors_[i].second;
		const Obstacle *obstacle2 = obstacle1->nextObstacle_;

		const Vector2 relativePosition1 = obstacle1->point_ - position_;
		const Vector2 relativePosition2 = obstacle2->point_ - position_;

		/*
		 * Check if velocity obstacle of obstacle is already taken care of by
		 * previously constructed obstacle ORCA lines.
		 * ์žฅ์• ๋ฌผ์˜ ์†๋„ ์žฅ์• ๋ฌผ์ด ์ด์ „์— ๊ตฌ์ถ•๋œ ์žฅ์• ๋ฌผ ORCA ๋ผ์ธ์— ์˜ํ•ด 
		 * ์ด๋ฏธ ์ฒ˜๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
		 */
		bool alreadyCovered = false;

		for (size_t j = 0; j < orcaLines_.size(); ++j) {
			//det : ํ–‰๋ ฌ์‹, radius_ : agent์˜ ๋ฐ˜์ง€๋ฆ„
			if (det(invTimeHorizonObst * relativePosition1 - orcaLines_[j].point, orcaLines_[j].direction) - invTimeHorizonObst * radius_ >= -RVO_EPSILON 
			&& det(invTimeHorizonObst * relativePosition2 - orcaLines_[j].point, orcaLines_[j].direction) - invTimeHorizonObst * radius_ >=  -RVO_EPSILON) {
				alreadyCovered = true;
				break;
			}
		}

		if (alreadyCovered) {
			continue;
		}

 

๋จผ์ € ๊ตฌ์ถ•๋œ ์žฅ์• ๋ฌผ ORCA ๋ผ์ธ์— ์˜ํ•ด ์ด๋ฏธ ์ฒ˜๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ฒ˜๋ฆฌ ๋˜์—ˆ๋‹ค๋ฉด ์ƒ๋žตํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์žฅ์• ๋ฌผ ORCA ๋ผ์ธ์„ ๋งŒ๋“ ๋‹ค.

	/* Create obstacle ORCA lines. */
	for (size_t i = 0; i < obstacleNeighbors_.size(); ++i) {
	
		/* Not yet covered. Check for collisions. */

		const float distSq1 = absSq(relativePosition1);
		const float distSq2 = absSq(relativePosition2);

		const float radiusSq = sqr(radius_);

		const Vector2 obstacleVector = obstacle2->point_ - obstacle1->point_;
		const float s = (-relativePosition1 * obstacleVector) / absSq(obstacleVector);
		const float distSqLine = absSq(-relativePosition1 - s * obstacleVector);

		Line line;

		if (s < 0.0f && distSq1 <= radiusSq) {
			/* Collision with left vertex. Ignore if non-convex. */
			if (obstacle1->isConvex_) {
				line.point = Vector2(0.0f, 0.0f);
				line.direction = normalize(Vector2(-relativePosition1.y(), relativePosition1.x()));
				orcaLines_.push_back(line);
			}

			continue;
		}
		else if (s > 1.0f && distSq2 <= radiusSq) {
			/* Collision with right vertex. Ignore if non-convex
			 * or if it will be taken care of by neighoring obstace */
			if (obstacle2->isConvex_ && det(relativePosition2, obstacle2->unitDir_) >= 0.0f) {
				line.point = Vector2(0.0f, 0.0f);
				line.direction = normalize(Vector2(-relativePosition2.y(), relativePosition2.x()));
				orcaLines_.push_back(line);
			}

			continue;
		}
		else if (s >= 0.0f && s < 1.0f && distSqLine <= radiusSq) {
			/* Collision with obstacle segment. */
			line.point = Vector2(0.0f, 0.0f);
			line.direction = -obstacle1->unitDir_;
			orcaLines_.push_back(line);
			continue;
		}

		//์•„๋ž˜ ์ฝ”๋“œ๋“ค ์‹คํ–‰
        //...

 

		/*
		 * No collision.
		 * Compute legs. When obliquely viewed, both legs can come from a single
		 * vertex. Legs extend cut-off line when nonconvex vertex.
		 * ์ถฉ๋Œ์€ ์—†์Šต๋‹ˆ๋‹ค.
		 * leg๋ฅผ ๊ณ„์‚ฐํ•˜์„ธ์š”. ๋น„์Šค๋“ฌํžˆ ๋ณผ ๋•Œ, ๋‘ leg๋Š” ํ•˜๋‚˜์˜ ๊ผญ์ง“์ ์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
		 * leg๋Š” ๋ณผ๋กํ•˜์ง€ ์•Š์€ ๊ผญ์ง“์ ์—์„œ ์ ˆ๋‹จ์„ ์„ ์—ฐ์žฅํ•ฉ๋‹ˆ๋‹ค.
		 */

		Vector2 leftLegDirection, rightLegDirection;

		if (s < 0.0f && distSqLine <= radiusSq) {
			/*
			 * Obstacle viewed obliquely so that left vertex 
			 * defines velocity obstacle.
			 * ์™ผ์ชฝ ๊ผญ์ง“์ ์ด ์†๋„ ์žฅ์• ๋ฌผ์„ ์ •์˜ํ•˜๋„๋ก ๋น„์Šค๋“ฌํžˆ ๋ณด์ด๋Š” ์žฅ์• ๋ฌผ.
			 */
			if (!obstacle1->isConvex_) {
				/* Ignore obstacle. */
				continue;
			}

			obstacle2 = obstacle1;

			const float leg1 = std::sqrt(distSq1 - radiusSq);
			leftLegDirection = Vector2(relativePosition1.x() * leg1 - relativePosition1.y() * radius_, relativePosition1.x() * radius_ + relativePosition1.y() * leg1) / distSq1;
			rightLegDirection = Vector2(relativePosition1.x() * leg1 + relativePosition1.y() * radius_, -relativePosition1.x() * radius_ + relativePosition1.y() * leg1) / distSq1;
		}
		else if (s > 1.0f && distSqLine <= radiusSq) {
			/*
			 * Obstacle viewed obliquely so that
			 * right vertex defines velocity obstacle.
			 * ์˜ค๋ฅธ์ชฝ ๊ผญ์ง“์ ์ด ์†๋„ ์žฅ์• ๋ฌผ์„ ์ •์˜ํ•˜๋„๋ก ๋น„์Šค๋“ฌํžˆ ๋ณด์ด๋Š” ์žฅ์• ๋ฌผ.
			 */
			if (!obstacle2->isConvex_) {
				/* Ignore obstacle. */
				continue;
			}

			obstacle1 = obstacle2;

			const float leg2 = std::sqrt(distSq2 - radiusSq);
			leftLegDirection = Vector2(relativePosition2.x() * leg2 - relativePosition2.y() * radius_, relativePosition2.x() * radius_ + relativePosition2.y() * leg2) / distSq2;
			rightLegDirection = Vector2(relativePosition2.x() * leg2 + relativePosition2.y() * radius_, -relativePosition2.x() * radius_ + relativePosition2.y() * leg2) / distSq2;
		}
		else {
			/* Usual situation. */
			if (obstacle1->isConvex_) {
				const float leg1 = std::sqrt(distSq1 - radiusSq);
				leftLegDirection = Vector2(relativePosition1.x() * leg1 - relativePosition1.y() * radius_, relativePosition1.x() * radius_ + relativePosition1.y() * leg1) / distSq1;
			}
			else {
				/* Left vertex non-convex; left leg extends cut-off line. */
				leftLegDirection = -obstacle1->unitDir_;
			}

			if (obstacle2->isConvex_) {
				const float leg2 = std::sqrt(distSq2 - radiusSq);
				rightLegDirection = Vector2(relativePosition2.x() * leg2 + relativePosition2.y() * radius_, -relativePosition2.x() * radius_ + relativePosition2.y() * leg2) / distSq2;
			}
			else {
				/* Right vertex non-convex; right leg extends cut-off line. */
				rightLegDirection = obstacle1->unitDir_;
			}
		}
/*
		 * Legs can never point into neighboring edge when convex vertex,
		 * take cutoff-line of neighboring edge instead. If velocity projected on
		 * "foreign" leg, no constraint is added.
		 */

		const Obstacle *const leftNeighbor = obstacle1->prevObstacle_;

		bool isLeftLegForeign = false;
		bool isRightLegForeign = false;

		if (obstacle1->isConvex_ && det(leftLegDirection, -leftNeighbor->unitDir_) >= 0.0f) {
			/* Left leg points into obstacle. */
			leftLegDirection = -leftNeighbor->unitDir_;
			isLeftLegForeign = true;
		}

		if (obstacle2->isConvex_ && det(rightLegDirection, obstacle2->unitDir_) <= 0.0f) {
			/* Right leg points into obstacle. */
			rightLegDirection = obstacle2->unitDir_;
			isRightLegForeign = true;
		}

		/* Compute cut-off centers. */
		const Vector2 leftCutoff = invTimeHorizonObst * (obstacle1->point_ - position_);
		const Vector2 rightCutoff = invTimeHorizonObst * (obstacle2->point_ - position_);
		const Vector2 cutoffVec = rightCutoff - leftCutoff;

		/* Project current velocity on velocity obstacle. */

		/* Check if current velocity is projected on cutoff circles. */
		const float t = (obstacle1 == obstacle2 ? 0.5f : ((velocity_ - leftCutoff) * cutoffVec) / absSq(cutoffVec));
		const float tLeft = ((velocity_ - leftCutoff) * leftLegDirection);
		const float tRight = ((velocity_ - rightCutoff) * rightLegDirection);

		if ((t < 0.0f && tLeft < 0.0f) || (obstacle1 == obstacle2 && tLeft < 0.0f && tRight < 0.0f)) {
			/* Project on left cut-off circle. */
			const Vector2 unitW = normalize(velocity_ - leftCutoff);

			line.direction = Vector2(unitW.y(), -unitW.x());
			line.point = leftCutoff + radius_ * invTimeHorizonObst * unitW;
			orcaLines_.push_back(line);
			continue;
		}
		else if (t > 1.0f && tRight < 0.0f) {
			/* Project on right cut-off circle. */
			const Vector2 unitW = normalize(velocity_ - rightCutoff);

			line.direction = Vector2(unitW.y(), -unitW.x());
			line.point = rightCutoff + radius_ * invTimeHorizonObst * unitW;
			orcaLines_.push_back(line);
			continue;
		}
/*
		 * Project on left leg, right leg, or cut-off line, whichever is closest
		 * to velocity.
		 */
		const float distSqCutoff = ((t < 0.0f || t > 1.0f || obstacle1 == obstacle2) ? std::numeric_limits<float>::infinity() : absSq(velocity_ - (leftCutoff + t * cutoffVec)));
		const float distSqLeft = ((tLeft < 0.0f) ? std::numeric_limits<float>::infinity() : absSq(velocity_ - (leftCutoff + tLeft * leftLegDirection)));
		const float distSqRight = ((tRight < 0.0f) ? std::numeric_limits<float>::infinity() : absSq(velocity_ - (rightCutoff + tRight * rightLegDirection)));

		if (distSqCutoff <= distSqLeft && distSqCutoff <= distSqRight) {
			/* Project on cut-off line. */
			line.direction = -obstacle1->unitDir_;
			line.point = leftCutoff + radius_ * invTimeHorizonObst * Vector2(-line.direction.y(), line.direction.x());
			orcaLines_.push_back(line);
			continue;
		}
		else if (distSqLeft <= distSqRight) {
			/* Project on left leg. */
			if (isLeftLegForeign) {
				continue;
			}

			line.direction = leftLegDirection;
			line.point = leftCutoff + radius_ * invTimeHorizonObst * Vector2(-line.direction.y(), line.direction.x());
			orcaLines_.push_back(line);
			continue;
		}
		else {
			/* Project on right leg. */
			if (isRightLegForeign) {
				continue;
			}

			line.direction = -rightLegDirection;
			line.point = rightCutoff + radius_ * invTimeHorizonObst * Vector2(-line.direction.y(), line.direction.x());
			orcaLines_.push_back(line);
			continue;
		}

 

	const size_t numObstLines = orcaLines_.size();

	const float invTimeHorizon = 1.0f / timeHorizon_;

	/* Create agent ORCA lines. */
	for (size_t i = 0; i < agentNeighbors_.size(); ++i) {
		const Agent *const other = agentNeighbors_[i].second;

		const Vector2 relativePosition = other->position_ - position_;
		const Vector2 relativeVelocity = velocity_ - other->velocity_;
		const float distSq = absSq(relativePosition);
		const float combinedRadius = radius_ + other->radius_;
		const float combinedRadiusSq = sqr(combinedRadius);

		Line line;
		Vector2 u;

		if (distSq > combinedRadiusSq) {
			/* No collision. */
			const Vector2 w = relativeVelocity - invTimeHorizon * relativePosition;
			/* Vector from cutoff center to relative velocity. */
			const float wLengthSq = absSq(w);

			const float dotProduct1 = w * relativePosition;

			if (dotProduct1 < 0.0f && sqr(dotProduct1) > combinedRadiusSq * wLengthSq) {
				/* Project on cut-off circle. */
				const float wLength = std::sqrt(wLengthSq);
				const Vector2 unitW = w / wLength;

				line.direction = Vector2(unitW.y(), -unitW.x());
				u = (combinedRadius * invTimeHorizon - wLength) * unitW;
			}
			else {
				/* Project on legs. */
				const float leg = std::sqrt(distSq - combinedRadiusSq);

				if (det(relativePosition, w) > 0.0f) {
					/* Project on left leg. */
					line.direction = Vector2(relativePosition.x() * leg - relativePosition.y() * combinedRadius, relativePosition.x() * combinedRadius + relativePosition.y() * leg) / distSq;
				}
				else {
					/* Project on right leg. */
					line.direction = -Vector2(relativePosition.x() * leg + relativePosition.y() * combinedRadius, -relativePosition.x() * combinedRadius + relativePosition.y() * leg) / distSq;
				}

				const float dotProduct2 = relativeVelocity * line.direction;

				u = dotProduct2 * line.direction - relativeVelocity;
			}
		}
		else {
			/* Collision. Project on cut-off circle of time timeStep. */
			const float invTimeStep = 1.0f / sim_->timeStep_;

			/* Vector from cutoff center to relative velocity. */
			const Vector2 w = relativeVelocity - invTimeStep * relativePosition;

			const float wLength = abs(w);
			const Vector2 unitW = w / wLength;

			line.direction = Vector2(unitW.y(), -unitW.x());
			u = (combinedRadius * invTimeStep - wLength) * unitW;
		}

		line.point = velocity_ + 0.5f * u;
		orcaLines_.push_back(line);
	}

	size_t lineFail = linearProgram2(orcaLines_, maxSpeed_, prefVelocity_, false, newVelocity_);

	if (lineFail < orcaLines_.size()) {
		linearProgram3(orcaLines_, numObstLines, lineFail, maxSpeed_, newVelocity_);
	}

 

๊ณ„์‚ฐ๋œ ORCA ๋ผ์ธ๋“ค๊ณผ Linear Programming์„ ์ด์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ์†๋„๋ฅผ ์–ป๋Š”๋‹ค.

๐Ÿ’กLinear Programming
๋‹ค์–‘ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ์„ ํ˜• ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ™”ํ•˜๋Š” ์ˆ˜ํ•™์  ๋ชจ๋ธ๋ง ๊ธฐ์ˆ 
size_t lineFail = linearProgram2(orcaLines_, maxSpeed_, prefVelocity_, false, newVelocity_);

if (lineFail < orcaLines_.size()) {
	linearProgram3(orcaLines_, numObstLines, lineFail, maxSpeed_, newVelocity_);
}

 

result == newVelocity_๋ž‘ ๊ฐ™๋‹ค.

size_t linearProgram2(const std::vector<Line> &lines, float radius, const Vector2 &optVelocity, bool directionOpt, Vector2 &result)
{
	if (directionOpt) {
		//์ตœ์ ํ™”๋˜์–ด ์žˆ๋Š” ๋ฐฉํ–ฅ. ์ด ๊ฒฝ์šฐ ์ตœ์ ํ™” ์†๋„๋Š” ๋‹จ์œ„ ๊ธธ์ด์ž…๋‹ˆ๋‹ค.
		result = optVelocity * radius;
	}
	else if (absSq(optVelocity) > sqr(radius)) {
		/* ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ๊ณผ ๋ฐ”๊นฅ์ชฝ ์›์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. */
		result = normalize(optVelocity) * radius;
	}
	else {
		/* ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ๊ณผ ์•ˆ์ชฝ ์›์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. */
		result = optVelocity;
	}

	for (size_t i = 0; i < lines.size(); ++i) {
		//๋‘ ์„ ์ด ๊ฐ™์œผ๋ฉด 0์„ ์ถœ๋ ฅ
		if (det(lines[i].direction, lines[i].point - result) > 0.0f) { // ํ‰ํ–‰์‚ฌ๋ณ€ํ˜•์˜ ๋ฉด์ 
			/* ๊ฒฐ๊ณผ๊ฐ€ ์ œ์•ฝ์กฐ๊ฑด i๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ตœ์ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. */
			const Vector2 tempResult = result;

			if (!linearProgram1(lines, i, radius, optVelocity, directionOpt, result)) {
				result = tempResult;
				return i;
			}
		}
	}

	return lines.size();
}

 

 

bool linearProgram1(const std::vector<Line> &lines, size_t lineNo, float radius, const Vector2 &optVelocity, bool directionOpt, Vector2 &result)
{
	//์Šค์นผ๋ผ ๊ณฑ, ๋ฒกํ„ฐ์˜ ๋‚ด์ 
	const float dotProduct = lines[lineNo].point * lines[lineNo].direction;
	const float discriminant = sqr(dotProduct) + sqr(radius) - absSq(lines[lineNo].point);

	if (discriminant < 0.0f) {
		/* ์ตœ๋Œ€ ์†๋„ ์›์€ line lineNo๋ฅผ ์™„์ „ํžˆ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค. */
		return false;
	}

	const float sqrtDiscriminant = std::sqrt(discriminant);
	float tLeft = -dotProduct - sqrtDiscriminant;
	float tRight = -dotProduct + sqrtDiscriminant;

	for (size_t i = 0; i < lineNo; ++i) {
		//๋ถ„๋ชจ
		const float denominator = det(lines[lineNo].direction, lines[i].direction);
		//๋ถ„์ž
		const float numerator = det(lines[i].direction, lines[lineNo].point - lines[i].point);
		//fabs() : ์ ˆ๋Œ€๊ฐ’ ์—ฐ์‚ฐ
		if (std::fabs(denominator) <= RVO_EPSILON) {
			/* Lines lineNo๊ณผ i๋Š” (๊ฑฐ์˜) ๋‚˜๋ž€ํ•˜๋‹ค. */
			if (numerator < 0.0f) {
				return false;
			}
			else {
				continue;
			}
		}

		const float t = numerator / denominator;

		if (denominator >= 0.0f) {
			/* Line i bounds line lineNo on the right. */
			tRight = std::min(tRight, t);
		}
		else {
			/* Line i bounds line lineNo on the left. */
			tLeft = std::max(tLeft, t);
		}

		if (tLeft > tRight) {
			return false;
		}
	}

	if (directionOpt) {
		/* ์ตœ์ ํ™” ๋ฐฉํ–ฅ */
		if (optVelocity * lines[lineNo].direction > 0.0f) {
			/* ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ทน๋‹จ์ ์œผ๋กœ. */
			result = lines[lineNo].point + tRight * lines[lineNo].direction;
		}
		else {
			/* ์™ผ์ชฝ์œผ๋กœ ๊ทน๋‹จ์ ์œผ๋กœ. */
			result = lines[lineNo].point + tLeft * lines[lineNo].direction;
		}
	}
	else {
		/* ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง€์ ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. */
		const float t = lines[lineNo].direction * (optVelocity - lines[lineNo].point);

		if (t < tLeft) {
			result = lines[lineNo].point + tLeft * lines[lineNo].direction;
		}
		else if (t > tRight) {
			result = lines[lineNo].point + tRight * lines[lineNo].direction;
		}
		else {
			result = lines[lineNo].point + t * lines[lineNo].direction;
		}
	}

	return true;
}

 

void linearProgram3(const std::vector<Line> &lines, size_t numObstLines, size_t beginLine, float radius, Vector2 &result)
{
	float distance = 0.0f;

	for (size_t i = beginLine; i < lines.size(); ++i) {
		if (det(lines[i].direction, lines[i].point - result) > distance) {
			/* ๊ฒฐ๊ณผ๊ฐ€ ์„  i์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. */
			std::vector<Line> projLines(lines.begin(), lines.begin() + static_cast<ptrdiff_t>(numObstLines));

			for (size_t j = numObstLines; j < i; ++j) {
				Line line;

				float determinant = det(lines[i].direction, lines[j].direction);

				if (std::fabs(determinant) <= RVO_EPSILON) {
					/* Line i ๊ณผ line j ๋Š” ๋‚˜๋ž€ํ•˜๋‹ค */
					if (lines[i].direction * lines[j].direction > 0.0f) {
						/* Line i ๊ณผ line j ๋Š” ๊ฐ™์€ ๋ฐฉํ–ฅ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค */
						continue;
					}
					else {
						/* Line i ๊ณผ line j ๋Š” ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค */
						line.point = 0.5f * (lines[i].point + lines[j].point);
					}
				}
				else {
					line.point = lines[i].point + (det(lines[j].direction, lines[i].point - lines[j].point) / determinant) * lines[i].direction;
				}

				line.direction = normalize(lines[j].direction - lines[i].direction);
				projLines.push_back(line);
			}

			const Vector2 tempResult = result;

			if (linearProgram2(projLines, radius, Vector2(-lines[i].direction.y(), lines[i].direction.x()), true, result) < projLines.size()) {
				/* ์›์น™์ ์œผ๋กœ ์ด๋Ÿฐ ์ผ์€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
				 * ๊ทธ ๊ฒฐ๊ณผ๋Š” ์ •์˜์ƒ ์ด ์„ ํ˜• ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ๊ฐ€๋Šฅ ์˜์—ญ์— ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
				 * ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ž‘์€ ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค์ฐจ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋ฉฐ ํ˜„์žฌ ๊ฒฐ๊ณผ๋Š” ๊ทธ๋Œ€๋กœ 
				 * ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
				 */
				result = tempResult;
			}

			distance = det(lines[i].direction, lines[i].point - result);
		}
	}
}

 

์—ฐ๊ด€ ํ‚ค์›Œ๋“œ

half plane, ORCA, Linear Programming, Velocity Obstacle, ๋ฏผ์ฝ”์šฐ์Šคํ‚ค ํ•ฉ

 

RVO ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ๊ตฐ์ค‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์˜ˆ์ œ ๋ชจ์Šต

 

* ์žฅ์• ๋ฌผ์—์„œ ๊ฑธ๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋งŽ์ด ๋‚˜์˜ค๋Š” ์ด์œ ๋Š” RVO ์ž์ฒด๊ฐ€ ์›€์ง์ด๋Š” Obstacle๋“ค์ด ์„œ๋กœ ์ฑ…์ž„์„ ๋ฐ˜ํ‹ˆ์”ฉ ๋‚˜๋ˆ„์–ด ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ • ์žฅ์• ๋ฌผ์—์„œ๋Š” ํšจ๊ณผ๊ฐ€ ๋œ ๋‚˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ธก*

 

 

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

 

[Algorithm] Linear Programming (1)

์ด ๊ธ€์€ ํฌ์Šคํ… ์˜ค์€์ง„ ๊ต์ˆ˜๋‹˜์˜ CSED331 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—…์˜ ๊ฐ•์˜ ๋‚ด์šฉ๊ณผ ์ž๋ฃŒ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

rntlqvnf.github.io

 

Optimal Reciprocal Collision Avoidance (ORCA)

We present a formal approach to reciprocal collision avoidance, where multiple independent mobile robots or agents need to avoid collisions with each other without communication among agents while moving in a common workspace. Our formulation, optimal reci

gamma.cs.unc.edu

 

Collision Avoidance

Description   Collision avoidance is a fundamental problem in many areas such as robotics and animation. To that end, we developed new techniques focused on providing fast and robust collision avoidance for multiple agents moving around obstacles and each

gamma.cs.unc.edu

 

Reciprocal Velocity Obstacles for Real-Time Multi-Agent Navigation

ABSTRACT We propose a new concept --- the "Reciprocal Velocity Obstacle" --- for real-time multi-agent navigation. We consider the case in which each agent navigates independently without explicit communication with other agents. Our formulation is an exte

gamma.cs.unc.edu

 

๋ฐ˜์‘ํ˜•

'๊ณต๋ถ€ > Crowd Simulation' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Velocity Obstacle(VO)๋ž€?  (0) 2020.01.17
728x90

 

๋…ผ๋ฌธ์˜ ํ•ต์‹ฌ ๋‚ด์šฉ

 

์†๋„ ์žฅ์• ๋ฌผ์€ ๋ฐ”๋€Œ๋Š” ์‹œ๊ฐ„ ํ™˜๊ฒฝ์„ ์œ„ํ•œ configuration space obstacle์˜ ํ™•์žฅ ๊ฐœ๋…์ด๋‹ค.

์ฆ‰ ์‹ค์‹œ๊ฐ„ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜๋‹ค.

Velocity Obstacle(์†๋„ ์žฅ์• ๋ฌผ)์€ ๊ฐ์ฒด์˜ Velocity๊ฐ€ ์†๋„ ์žฅ์• ๋ฌผ์ธ VO ์˜์—ญ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด ๋ฌผ์ฒด๋Š” ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐœ๋…์ด๋‹ค.
 

๋งŒ์•ฝ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด A์™€ B ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, A์™€ B๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ A๋Š” B๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด ํ”ผํ• ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๋Š” ์†๋„ ์กฐ์ ˆ ๋ฐฉ๋ฒ•์ด๋‹ค.
 

 
๊ตฐ์ค‘์—์„œ ํ•œ๊ฐœ์˜ ๊ฐ์ฒด๋“ค์€ ๊ฐ๊ฐ์˜ Velocity(๋ฐฉํ–ฅ์„ ๊ฐ€์ง„ ์†๋„)๋ฅผ ๊ฐ€์ง„๋‹ค.  ์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” A๊ฐ€ ๊ฐ€์ง„ ์†๋„๋Š” VA๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , B๊ฐ€ ๊ฐ€์ง„ ์†๋„๋Š” VB๋กœ ๋‚˜ํƒ€๋‚ด์—ˆ๋‹ค.

VO๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Configurations Space๋กœ ๋ณ€ํ™˜ํ•ด์•ผํ•˜๋Š”๋ฐ, Configuration Space๋Š” ์ˆ˜ํ•™์—์„œ๋Š” ์œ„์ƒ ๊ณต๊ฐ„์˜ ์œ„์น˜์— ๋Œ€ํ•œ ์  ๋ชจ์Œ ํ• ๋‹น์„ ์„ค๋ช…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
์œ„์ƒ๊ณต๊ฐ„์€ ํŠน์ •ํ•œ ๊ณ„๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ƒํƒœ๋“ค์˜ ๊ณต๊ฐ„์ด๋‹ค.

์  A์˜ ์œ„์น˜์—์„œ ๋ฐ”๋ผ๋ณผ ๋•Œ A์˜ ๋ชธ์ฒด(์›ํ˜•)๊ณผ B์˜ ๋ชธ์ฒด(์›ํ˜•)์ด ๋‹ฟ์ง€ ์•Š๋Š” ์ ๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— A์™€B์˜ ๋ชธ์ฒด์˜ ์œ„์น˜๋“ค์„ ๊ณ ๋ คํ•œ A+B ๋ชธ์ฒด(์›ํ˜•)๊ณผ ๋งž๋‹ฟ์•„ ์žˆ๋Š” 2๊ฐœ์˜ ์ง์„ ์„ ๊ทธ์–ด์„œ VO๋ฅผ ์ •์˜ํ•œ๋‹ค.
A์—์„œ B์— ๋Œ€ํ•œ VO๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ, ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์  A์˜ ์œ„์น˜์—์„œ B์˜ ์™ธ๊ณฝ์„ ์ง€๋‚˜๋Š” ์ง์„  2๊ฐœ๋ฅผ ๊ตฌํ•œ๋‹ค. ์ด ์ง์„  ๋‘๊ฐœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ VO๋Š” ํšŒ์ƒ‰ ๊ณต๊ฐ„์œผ๋กœ ํ‘œ์‹œ๋œ ๊ณต๊ฐ„์ด๋‹ค. ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ์ด ๊ณต๊ฐ„์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด B์™€ ์ ˆ๋Œ€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”๋‹ค.
๊ตฐ์ค‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ Path Planning(๊ฒฝ๋กœ ๊ณ„ํš)์„ ์ง€์ •ํ•  ๋•Œ, ์ด๋Ÿฌํ•œ ์†๋„ ์žฅ์• ๋ฌผ์„ ์‘์šฉํ•ด์„œ ๋„ฃ๋Š”๋‹ค.

๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ A๊ฐ€ B์— ๋Œ€ํ•ด ๊ณ„์‚ฐํ•œ ํšŒ์ƒ‰ ์˜์—ญ์€ VB๋งŒํผ ์ด๋™ํ•  ๊ฒƒ์ด๋‹ค.
ํšŒ์ƒ‰ ์˜์—ญ์€ "Collision cone"์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
Collision cone์€ ๊ณ„์‚ฐํ• ๋•Œ A์™€ B์˜ ๋ฐ˜์ง€๋ฆ„์„ ๋”ํ•œ ์›์— ๋Œ€ํ•ด์„œ ์™ธ๊ณฝ์„ ์ง€๋‚˜๋Š” ์„  2๊ฐœ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•œ๋‹ค.
 
๋”ฐ๋ผ์„œ, A์˜ Velocity๋ฅผ ์กฐ์ ˆํ•  ๋•Œ VB๋งŒํผ ์ด๋™ํ•œ ํšŒ์ƒ‰ ์˜์—ญ VO๋ฅผ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๋Š” Velocity๋ฅผ ์กฐ์ ˆํ•˜๋ฉด ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ A๋Š” B๋ฅผ ํ”ผํ•ด์„œ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ์กด์˜ VA ์†๋„๋ฅผ VO๋ฅผ ํ”ผํ•ด์„œ ๋นจ๊ฐ„์ƒ‰ ๋ถ€๋ถ„๋งŒํผ์œผ๋กœ ์กฐ์ •ํ•˜๋ฉด์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ง„ํ–‰์‹œํ‚ค๋ฉด ์ถฉ๋Œ์„ ํšŒํ”ผํ•˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

VO์˜ ์ง„๋™ ํ˜„์ƒ์„ ์ค„์ธ RVO

 

Reciprocal Velocity Obstacle(RVO) : RVO2

์ƒˆ๋กœ์šด ๊ฐœ๋…์ธ Reciprocal Velocity Obstacle(์ดํ•˜ RVO)๋ฅผ ์ œ์•ˆํ•จ ๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ์™€ ๋ช…์‹œ์ ์œผ๋กœ ํ†ต์‹ ํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์›€์ง์ด๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•จ ์›€์ง์ด๋Š” ์žฅ์• ๋ฌผ๋“ค ์‚ฌ์ด์—์„œ์˜ ์›€์ง์ž„์„

dana3711.tistory.com

 


 
velocity obstacle ๊ด€๋ จ ์ž๋ฃŒ : https://en.wikipedia.org/wiki/Velocity_obstacle

๋…ผ๋ฌธ ์ฐธ๊ณ  : Motion Planning in Dynamic Environments using Velocity Obstacles - 1998๋…„๋„ ๋ฐœํ–‰ 

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•

'๊ณต๋ถ€ > Crowd Simulation' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Reciprocal Velocity Obstacle(RVO) : RVO2  (0) 2020.01.21
728x90

- BIOS์—์„œ SVM ํ™œ์„ฑํ™”ํ•˜๊ธฐ

- ๊ทธ ํ›„ Windows ๊ธฐ๋Šฅ ์ผœ๊ธฐ/๋„๊ธฐ -> Windows ํ•˜์ดํผ๋ฐ”์ด์ € ํ”Œ๋žซํผ ์ฒดํฌ -> ์žฌ๋ถ€ํŒ…

์ˆœ์„œ๋กœ ํ•˜๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!

 

๋ฐ˜์‘ํ˜•
728x90

ํฌํŠธ๋ž€?

์ปดํ“จํ„ฐ ํ•˜๋“œ์›จ์–ด ํฌํŠธ : ์ปดํ“จํ„ฐ์™€ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ, ์žฅ์น˜ ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• . ์žฅ๋น„์— ์ผ€์ด๋ธ”์ด๋‚˜ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํŠน๋ณ„ํ•œ ์™ธ๋ถ€ ๋‹จ์ž

์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด ํฌํŠธ : ํ”„๋กœ๊ทธ๋žจ ๊ฐ™ ์ƒํ˜ธ ์ •๋ณด ๊ตํ™˜์‹œ ํŒŒ์ผ์ด๋‚˜ ์ž„์‹œ ์ €์žฅ์†Œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ์˜ ๋…ผ๋ฆฌ์  ์ ‘์†

 

ํฌํŠธ์˜ ์žฅ์ 

-ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์ธํ„ฐ๋„ท ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

-์ž์‹ ์ด ์›ํ•˜๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œˆ๋„์šฐ๋Š” C:\WINDOWS\system32\drivers\etc\services ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

service ํŒŒ์ผ์— ์˜ˆ์•ฝ๋œ ์ฃผ์š” ํ”„๋กœํ† ์ฝœ

 ํฌํŠธ ๋ฒˆํ˜ธ 

 ํ”„๋กœํ† ์ฝœ ์ด๋ฆ„ 

 ์„ค๋ช… 

 20,21

 FTP 

 ํŒŒ์ผ ์ „์†ก ํ”„๋กœํ† ์ฝœ 

 22

 SSH

 ๋ณด์•ˆ ์›๊ฒฉ ์ ‘์† ํ”„๋กœํ† ์ฝœ 

 23

 ํ…”๋„ท

 ์›๊ฒฉ ์ ‘์† ํ”„๋กœํ† ์ฝœ 

 25

 SMTP

 ์ธํ„ฐ๋„ท ๋ฉ”์ผ ํ”„๋กœํ† ์ฝœ 

 37

 TIME 

 ์‹œ๊ฐ„ ๋™๊ธฐํ™” ํ”„๋กœํ† ์ฝœ(์ปดํ“จํ„ฐ ๊ฐ„ ์‹œ๊ฐ„์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค) 

 53

 ๋„๋ฉ”์ธ 

 ๋„๋ฉ”์ธ ์ด๋ฆ„ ์„œ๋น„์Šค ํ”„๋กœํ† ์ฝœ 

 80

 HTTP 

 ํ•˜์ดํผ ๋ฌธ์„œ ์ „์†ก ํ”„๋กœํ† ์ฝœ 

 110

 POP3

 ์ด๋ฉ”์ผ ์ „์†ก ํ”„๋กœํ† ์ฝœ 

 

๋ฐ˜์‘ํ˜•
728x90

๋ฒ„๋ธ”์ •๋ ฌ์„ ์ด์šฉํ•˜์—ฌ ๋žญํ‚น ์‹œ์Šคํ…œ์„ c++๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ๊ฒŒ์ž„์„ ์งค๋•Œ ๋žญํ‚น ์‹œ์Šคํ…œ์— ์ข…์ข… ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ๊ตฐ์š”

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream>
#include<string>
using namespace std;
 
int main() {
    string array[10][2];
    string temp[1][2];// ๊ฐ’์˜ ์œ„์น˜๊ตํ™˜์— ์‚ฌ์šฉ ๋  ๋ณ€์ˆ˜
 
                      /*๋ฐฐ์—ด ์ดˆ๊ธฐํ™”*/
    for (int i = 0; i < 10; i++) { // ํ–‰
        array[i][0= { "___ " }; // ์—ด
        array[i][1= { "0" };
    }
    for (int j = 0; j < 9; j++)
    {
        for (int i = j; i < 9; i++)                    //๊ฐ’์ด ๊ทธ ๋‹ค์Œ๊ฐ’๋ถ€ํ„ฐ ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฏ€๋กœ
        {
            cout << "์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”:";
            cin >> array[i][0];
            cout << "์ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”:";
            cin >> array[i][1];
 
            for (int y = 9; y > 0; y--){
                for (int z = 0; z < y; z++) {
                    if (atoi(array[z][1].c_str()) < atoi(array[z + 1][1].c_str())) {
                        /*์ ์ˆ˜๋ถ€๋ถ„ ๋ณต์‚ฌ*/
                        temp[0][1= array[z][1];
                        array[z][1= array[z + 1][1];
                        array[z + 1][1= temp[0][1];
 
                        /*์ด๋ฆ„๋ถ€๋ถ„ ๋ณต์‚ฌ*/
                        temp[0][0= array[z][0];
                        array[z][0= array[z + 1][0];
                        array[z + 1][0= temp[0][0];
                    }
                }
            }
            cout << "-์ ์ˆ˜ ๋žญํ‚น-" << endl;
            for (i = 0; i < 10; i++) {
                cout << i + 1 << "  " << array[i][0<< "  " << array[i][1<< endl;
            }
            cout << endl;
        }
    }
    return 0;
}
 
cs
๋ฐ˜์‘ํ˜•
728x90

2017/09 ์ž‘ํ’ˆ

 

์ดˆ๋ฐฅ์˜ ๊ธธ์€ ๋‚˜ ๋‚˜๋ฆ„๋Œ€๋กœ์˜ ์• ์ •์ด ๋งŽ์ด ๋‹ด๊ธด ํ”„๋กœ์ ํŠธ์ด๋‹ค

๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ทธ๋ ‡๋“ฏ ์ˆœํƒ„์น˜ ์•Š์€ ํ”„๋กœ์ ํŠธ์˜€์ง€๋งŒ ๋งˆ๋ฌด๋ฆฌ๋Š” ์ž˜๋˜์—ˆ๋‹ค

๊ณต๋ชจ์ „๋„ ์ฐธ์—ฌํ•ด๋ณด์•˜์ง€๋งŒ ์ž˜ ๋˜์ง„ ์•Š์•˜๋‹ค

๊ต๋‚ด ํ•ด์ปคํ†ค ๋Œ€ํšŒ์—์„œ ๋ฌด๋ฐ•2์ผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“  ํ›„ ๊ฐœ๋ฐœ์ž๋“ค๋ผ๋ฆฌ ์งฌ์งฌ์ด ํ•œ๋‹ฌ ๋™์•ˆ ๊ฐœ๋ฐœํ•˜์˜€์—ˆ๋‹ค.

 

 

 

์šฐ๋ฆฌํŒ€ ๋””์ž์ด๋„ˆ๋ถ„์ด ๊ณ ์ƒํ•ด์ฃผ์…จ๋‹ค.(3๋ช… ํ”„๋กœ๊ทธ๋ž˜๋ฐ, 1๋ช… ๊ทธ๋ž˜ํ”ฝ) 

๊ทธ ์ค‘์— ์ €๋Š” ์†๋‹˜์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

์‹ค์ œ ๊ฒŒ์ž„ ํ™”๋ฉด์ด๊ณ  ํŽธ์ง‘๋œ ๋™์˜์ƒ์„ ์บก์ณํ•œ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

 

 

 

๋ฐฅ + ์™€์‚ฌ๋น„ + ํšŒ๋ฅผ ์ด์šฉํ•ด์„œ ์ดˆ๋ฐฅ์„ ๋งŒ๋“ค์–ด์„œ ์†๋‹˜์˜ ์ž…์œผ๋กœ ๋˜์ง€๋Š” ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋˜์ง„๋‹ค๊ณ  ํ•  ๋•Œ ์‚ฌ๋žŒ๋“ค์˜ ํฅ๋ฏธ๋„๊ฐ€ ๊ฐ€์žฅ ๋†’์•˜์Šต๋‹ˆ๋‹ค.(ํฅ๋ฏธ๋กœ์šด ๋ฐœ์ƒ์ด์˜€๋‚˜๋ณด๋„ค์š”)

 

 

์˜์—…์‹œ๊ฐ„์ด ์ข…๋ฃŒ๋˜๊ณ  BreakTime์ผ ๋•Œ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

ํšŒ๋ฅผ ์†์งˆํ•ด์„œ ๋„๋งˆ์— ์žฌ๋ฃŒ๋ฅผ ์ฑ„์›Œ๋„ฃ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

 

 

์‹ค์ œ๋กœ ์ฐธ์น˜๋ฅผ ์นผ๋กœ ์จ๋Š” ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค!

๋ฌผ๋ก  ์š”๋ฆฌ์™• ๋น„๋ฃก์ฒ˜๋Ÿผ ํ•œ๋ฒˆ์˜ ์นผ์งˆ๋กœ ๋‹ค ์†์งˆ์ด ๋˜๋Š” ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ œ์ผ ์žฌ๋ฐŒ์–ด ํ–ˆ๋˜ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ ํ”Œ๋ ˆ์ด์–ด๋“ค์€ ์ œ์ผ ์–ด๋ ค์›Œํ–ˆ์Šต๋‹ˆ๋‹ค.(์•„๋งˆ๋„ VIVE์— ์ต์ˆ™ํ•˜์ง€ ์•Š์•˜๋˜ ์‚ฌ๋žŒ๋“ค)

 

 

๋ผ์ดํ”„๊ฐ€ ๋‹ค ๊น์ด๋ฉด ์ ์ˆ˜์ฐฝ์ด ๋‚˜ํƒ€๋‚˜๊ณ  ๋‹ค์‹œ ์žฌ์‹œ์ž‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์‹ค์ œ๋กœ ๋Œ€๊ตฌ ์—‘์Šค์ฝ”์—์„œ ๊ฐœ์ตœ๋˜์—ˆ๋˜ ์œตํ•ฉICT ์ „์‹œํšŒ์—์„œ ์ „์‹œ๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋””์ž์ด๋„ˆ๋ถ„์ด ์•„์ฃผ ํ›Œ๋ฅญํ•˜๊ณ  ์นœ์ ˆํ•˜๊ฒŒ ์•„์ด๋“ค์—๊ฒŒ ๊ฐ€๋ฅด์ณ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์ œ๊ฐ€ ์ง  ์ฝ”๋“œ์˜ ๋ถ€๋ถ„๋ถ€๋ถ„์„ ์˜ฌ๋ ธ๋Š”๋ฐ ์ข€๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด! ๋” ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค~

์‹œ๊ฐ„์ด ๋œ๋‹ค๋ฉด ์ข€ ๋” ๋‹ค๋“ฌ์–ด์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ์€ ๋งˆ์Œ์ด ์žˆ๋Š” ๊ฒŒ์ž„์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
728x90

- ํŠธ๋กœ์ด ๋ชฉ๋งˆ

์ž๊ธฐ ๋ณต์‚ฌ ๋Šฅ๋ ฅ์€ ์—†์ด ๊ณ ์˜์ ์ธ ๋ถ€์ž‘์šฉ๋งŒ ์ผ์œผํ‚ค๋Š” ํ”„๋กœ๊ทธ๋žจ

๊ณ ์˜์ ์œผ๋กœ ํฌํ•จ๋˜์—ˆ๋‹ค๋Š” ์ ์—์„œ ๋ฒ„๊ทธ์™€๋Š” ๋‹ค๋ฅด์ง€๋งŒ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค๋ฅธ ํŒŒ์ผ์— ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค์™€ ๊ตฌ๋ณ„๋จ

์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œ์ผฐ์„ ๋•Œ ํ•˜๋“œ๋””์Šคํฌ์˜ ํŒŒ์ผ์„ ์ง€์šฐ์ง€๋งŒ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์— ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ํŠธ๋กœ์ด๋ชฉ๋งˆ ํ”„๋กœ๊ทธ๋žจ

 

- ์Šค๋‹ˆํ•‘

์ž์‹ ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ƒ๋Œ€๋ฐฉ๋“ค์˜ ํŒจํ‚ท์„ ์—ฟ๋“ฃ๊ฑฐ๋‚˜ ์—ฟ๋ณด๋Š” ๊ฒƒ

๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋„์ฒญํ•˜๋Š” ๊ฒƒ

 

- ์›œ(=์ธํ„ฐ๋„ท ์›œ)

๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•˜์—ฌ ์ž๊ธฐ ์ž์‹ ์„ ๋ณต์ œํ•˜์—ฌ ์ „ํŒŒํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋™์ž‘

 

- ์Šคํ‘ธํ•‘

ํ•ดํ‚น์‹œ ์ž์‹ ์˜ IP์ฃผ์†Œ, DNS ์ด๋ฆ„, MAC ์ฃผ์†Œ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ์œ„์žฅํ•˜์—ฌ ์—ญ์ถ”์ ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•

๋ฐ˜์‘ํ˜•
728x90

โ€‹


2017/09์›” ์ฐธ์—ฌ

์ดํ‹€๋™์•ˆ ์ฐธ๊ฐ€ํ•˜๋ฉด์„œ ์žฅ๊ณ ๊ฑธ์Šค ์—ฐ๊ฒฐํ•˜๋Š”๋ฒ•๊ณผ ์„œ๋ฒ„์— ์˜ค๋ ค๋ณด๋Š” ๋“ฑ ์œ ์ตํ•œ ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค!

์ฆ๊ฑฐ์› ๊ณ  ์„œ๋ฒ„๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ๋”์šฑ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ๋˜์—ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
728x90

ํ˜„์žฌ๋Š” Unity์˜ Localize๋ผ๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์„œ ํ•ด๋‹น ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋‹ค.

 

-------------------------------------------------------------------------------------------------------------------

Project_R์„ ๋งŒ๋“œ๋Š” ์ค‘์ธ๋ฐ XML์„ ์ด์šฉํ•˜์—ฌ์„œ NPC๋“ค์˜ ์–ธ์–ด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ค‘์ด๋‹ค.

 

๋Œ€์ถฉ ์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ํ˜„์žฌ๋Š” ํ•œ๊ตญ์–ด์— ๋Œ€ํ•œ ์ •๋ณด๋“ค๋งŒ ๋จผ์ € ๋ถˆ๋Ÿฌ์™€๋†“๊ณ  ์“ฐ๋Š” ํ˜•์‹์ธ๋ฐ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ..

์ผ๋‹จ KOREAN๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฑด ์ข‹์ง€ ์•Š์œผ๋‹ˆ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•ด๋ณด์ž

 

์ผ๋‹จ langNum์— ๋”ฐ๋ผ ๋‘๊ฐ€์ง€๋ฅผ ๋ฐ›์•„ ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๊ณ  ์ด์   ์ด๊ฑธ option ๋ฐ”์˜ language์„ค์ •์— ๋”ฐ๋ผ ๋ฐ”๊พธ๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๋Š”๋ฐ

๊ณ ๋ฏผ๋˜๋Š” ๋ถ€๋ถ„์ด ์–ธ์–ด๋ฅผ ๋ฐ”๊พธ๊ณ  ํ™•์ธ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋“  ์„ค์ •๊ฐ’์ด ๋ฐ”๋€Œ์–ด์•ผํ•˜๋Š”๋ฐ ์ง€๊ธˆ xml์— ๋“ค์–ด ์žˆ๋Š” ๊ฐ’๋“ค์€ npc๋“ค์˜ ๋Œ€์‚ฌ๋ฐ–์— ์—†๋‹ค.

ํ .. xml์„ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค๊ณ  ์ด๊ฒƒ์ €๊ฒƒ ๋Œ์–ด๋‹ค๊ฐ€ ์“ธ๊นŒ ์ƒ๊ฐ์„ ํ•˜๋Š”๋ฐ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๋ฉด ๋ ‰์ด ์ƒ๊ธฐ์ง€ ์•Š์„๊นŒํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

์ผ๋‹จ ์ง€๊ธˆ์€ NPC ๋Œ€์‚ฌ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์–ธ์–ด๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด๋„๋ก ํ•˜์ž.

์™„์ „ ํ…Œ์ŠคํŠธ ์šฉ์ด๋ฏ€๋กœ ESCํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚˜๊ณ  ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ณ€๊ฒฝ๋˜๋Š” ํ˜•์‹์œผ๋กœ ์„ค์ •ํ•ด๋†“์•„๋ณด์ž

 

๋Œ€์ถฉ ์ด๋Ÿฐ์‹์œผ๋กœ ์ž„์‹œ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

์Œ.. ์ฝ”๋“œ์— ESC๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ € ์ฐฝ์ด ๋œจ๋„๋ก ๋ฐ”๊พธ์ž

์ ์šฉํ•œ ๋ชจ์Šต

ํ  ์ด์ œ ์–ธ์–ด ๋ฐ”๊พธ๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด npc์˜ ์–ธ์–ด๊ฐ€ ๋ฐ”๋€Œ๋„๋ก ํ•ด๋ด…์‹œ๋‹ค.

 

์™„์„ฑํ™”๋ฉด

com ์€ come์œผ๋กœ ๋ฐ”๊ฟ”์•ผ๊ฒ ๋‹ค. 

๋‹ค์Œ๋ฒˆ์—๋Š” ์˜ต์…˜์ฐฝ์— ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ 2๊ฐ€์ง€ ์„ ํƒ์ง€๋ฅผ ์ฃผ๊ณ  ์ €์žฅํ•˜๋ฉด ๋ฐ”๋€Œ๋Š” ํ˜•์‹์œผ๋กœ ์ข€ ๋” ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜์—ฌ์•ผ๊ฒ ๋‹ค.

 

๋ฐ˜์‘ํ˜•
728x90

์ด๋ฒˆ์—๋Š” ๋งต ์ด๋™์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ด€ํ•œ ๊ณ ์ฐฐ์„ ํ•ด๋ณผ๊ฒƒ์ธ๋ฐ..

์•„์ง ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•ด์„œ ๋งˆ์„์€ ๋ชป๋งŒ๋“ค์—ˆ์ง€๋งŒ ๊ฐ€๋ช…์œผ๋กœ F๋งˆ์„,W๋งˆ์„์ด๋ผ๊ณ  ํ•˜๊ฒ ๋‹ค.

์ผ๋‹จ MapManager๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

F๋กœ ๊ฐ€๋Š” ํฌํƒˆ์€ ํŒŒ๋ž€์ƒ‰ ์ง€์ ์— W๋กœ ๊ฐ€๋Š” ํฌํƒˆ์€ ์ดˆ๋ก์ƒ‰ ์ง€์ ์— ์žˆ๋‹ค.

๋จผ์ € mapArray๋กœ 3๊ฐ€์ง€์˜ ๋งต์„ ๋ถˆ๋Ÿฌ์˜ค์ž.

3๊ฐœ์˜ ๋งต์˜ค๋ธŒ์ ํŠธ๋Š” Map์ด๋ผ๋Š” ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ํ•˜์œ„์— ๋“ค์–ด์žˆ์œผ๋ฉฐ Awake()ํ•จ์ˆ˜์—์„œ ์ž๋™์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ•˜๊ฒ ๋‹ค.

๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด Map ํ•˜์œ„ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋‹ค์Œ ๊ฐ๊ฐ์˜ ํฌํƒˆ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๋“ค์„ ๋˜‘๊ฐ™์ด ์ ์šฉํ•˜์—ฌ์ค€๋‹ค.

ํฌํƒˆ๋“ค๋„ ๋˜‘๊ฐ™์€ ๊ณผ์ •์„ ์ด์šฉํ•˜์—ฌ์„œ ์ ์šฉ์‹œ์ผœ์ค€๋‹ค.

ํ•˜์ง€๋งŒ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๋‘๊ฐœ ํฌํƒˆ์„ ์ด์šฉํ•˜์—ฌ์„œ ์™”๋‹ค๊ฐ”๋‹ค ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.

๋‘๊ฐœ์˜ transform์„ ๋‹ด๊ณ  ์žˆ๋Š” linkedPotal์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  2๊ฐœ์˜ ํฌํƒˆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ํฌํƒˆ ์ •๋ณด๋ฅผ ๋“ค๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

2์ค‘ for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ์„œ ํ•˜์œ„ ์˜ค๋ธŒ์ ํŠธ ํ•œ๊ฐœ๋ฅผ ๋“ค๊ณ  ์˜ค๊ณ  ๊ทธ ์˜ค๋ธŒ์ ํŠธ์˜ ํ•˜์œ„์˜ค๋ธŒ์ ํŠธ๋“ค์„ ์ €์žฅํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ œ์ž‘ํ•˜์˜€๋‹ค.

์‹œ์ž‘๋˜๋ฉด ์ฐจ๋ก€์ฐจ๋ก€๋Œ€๋กœ ๋“ค์–ด๊ฐ€๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ํฌํƒˆ์— ๋‹ฟ์œผ๋ฉด ์ง€์ •๋œ ์œ„์น˜๋กœ ๋ณ€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์ž

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํฌํƒˆ์— ๋‹ฟ์œผ๋ฉด MapManager์˜ enterPotal์ด๋ž€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋ฐ‘์— ๋ถ€๋ถ„์€ ์งค๋ ธ๋Š”๋ฐ pos๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฐ˜ํ™˜ํ•œ๊ฒƒ์„ ํ”Œ๋ ˆ์ด์–ด์—์„œ ์ž„์‹œ๋กœ ์ €์žฅํ•ด๋†“๋Š”๋‹ค.

์™œ๋ƒ๋ฉด fade in๊ณผ out์„ ์‹คํ–‰ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

์—ฌ๊ธฐ์„œ ์ž ๊น ํ—ค๋งค์—ˆ๋Š”๋ฐ fade in out์„ ์‹œ์ž‘ ์‹ธ์ธ์„ ์ฃผ๊ณ  ๋ฐ”๋กœ position์„ ๋น„๊ฟ”๋ฒ„๋ฆฌ๋‹ˆ๊นŒ ์–ด์ƒ‰ํ•œ ๊ฐ์ด ์žˆ์–ด์„œ fade out์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋ฐ˜ํ™˜์ ์—์„œ ํ”Œ๋ ˆ์ด์–ด์˜ ์œ„์น˜๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

ํ•  ๋•Œ๋Š” fade in๊ณผ out์„ ํ•  ์ƒ๊ฐ์ด ์—†์—ˆ๋Š”๋ฐ ํ•˜๋‹ค๋ณด๋‹ˆ ๋น ์ ธ๋“ค์–ด์„œ ํ™€๋ฆฐ๋“ฏ์ด ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์™„์„ฑ๋œ ๋ชจ์Šต

ํฐ์ƒ‰ ํ๋ธŒ๊ฐ€ ํฌํƒˆ ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

sweep and prune์€ ๊ต์ˆ˜๋‹˜๊ป˜์„œ ํŠน์ • ๋…ผ๋ฌธ์„ ์ฝ์œผ๋ผ๊ณ  ํ•˜์…จ์„ ๋•Œ ๋ณธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค

ํ•˜์ง€๋งŒ ํ•œ๊ธ€ ํ•ด์„์ด ๋œ ํฌ์ŠคํŒ…์ด ์—†์–ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฒˆ์—ญํ•˜์—ฌ ๋†“๊ณ  ์ ์  ์ถ”๊ฐ€ ๋ฐ ๋ณด์™„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ https://github.com/mattleibow/jitterphysics/wiki/Sweep-and-Prune ์„ ํ•œ๊ตญ์–ด๋กœ ํ•ด์„ํ•œ ํฌ์ŠคํŒ…์œผ๋กœ ๋ฌธ์ œ๊ฐ€๋  ์‹œ ์‚ญ์ œํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

 

 

 

๊ด‘์—ญ ์ถฉ๋Œ ์‹œ์Šคํ…œ์€ ๋ชจ๋“  ๋ฌผ๋ฆฌ ์—”์ง„์˜ ํ•ต์‹ฌ ๊ณผ์ • ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ด‘์—ญ ์ถฉ๋Œ์— ๋Œ€ํ•ด ๋†“์นœ ๊ฒŒ ์žˆ๋‹ค๋ฉด ๊ด‘์—ญ ์ถฉ๋Œ์‹œ์Šคํ…œ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ์„œ ๋ณต๊ตฌํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ฆฌ ์—”์ง„์—์„œ ์ถฉ๋Œ ๋‹จ๊ณ„์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. Broadphase : ๊ด‘๋Œ€ํ•œ ๋ฒ”์œ„

- ์—ฌ๊ธฐ์„œ ์–ด๋–ค ์ถฉ๋Œ์ด ์‹ค์ œ๋กœ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ถฉ๋Œํ•  ์ˆ˜ ์—†๋Š” ์ถฉ๋Œ์„ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ํ• ๋งŒํ•œ ์‚ฌ์ดํŠธ : https://developer.nvidia.com/gpugems/gpugems3/part-v-physics-simulation/chapter-32-broad-phase-collision-detection-cuda

 

Chapter 32. Broad-Phase Collision Detection with CUDA

Chapter 32. Broad-Phase Collision Detection with CUDA Scott Le Grand NVIDIA Corporation Collision detection among many 3D objects is an important component of physics simulation, computer-aided design, molecular modeling, and other applications. Most effic

developer.nvidia.com

 

2. Midphase : ์ค‘๊ฐ„ ๋ฒ”์œ„

- ๊ตฌ๋‚˜ ์ฒœ ๋ฌผ์ฒด ๊ฐ™์€ ๊ธฐํ•˜ํ•™์  ๋‹จ๊ณ„์—์„œ์˜ ์ถฉ๋Œ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. 

 

3. Narrowphase : ์ข์€ ๋ฒ”์œ„

- ์ด ๋‹จ๊ณ„์—์„œ ์‹ค์ œ ์ถฉ๋Œ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.  ๊ต์ฐจ์ , ์ถฉ๋Œ ๋ฒ•์„  ๋˜๋Š” ์นจํˆฌ ๊นŠ์ด์™€ ๊ฐ™์€ ์ถฉ๋Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฑฐ์˜ ๋ชจ๋“  ๊ด‘์—ญ ์‹œ์Šคํ…œ์€ ๊ฐ์ฒด์˜ ์ถ• ์ •๋ ฌ๋œ ๊ฒฝ๊ณ„ ์ƒ์ž(aabb)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

aabb๋Š” ๊ฝค ๋นจ๋ฆฌ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ต์ฐจ์ ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ํ• ๋งŒํ•œ ์‚ฌ์ดํŠธ : https://blog.naver.com/mycode333/50031266282

 

AABB์™€ AABB ์ถฉ๋Œ

AABB( Axis Aligned Bounding Box)๋Š” ์ถ•์— ์ •๋ ฌ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ•์Šค๊ฐ€ ํšŒ์ „ํ•˜์ง€ ์•Š๊ณ  ์ถ• ๋ฐฉํ–ฅ...

blog.naver.com

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด "๊ฒน์น˜์ง€ ์•Š๋Š” ์Œ์˜ ์ •๋ ฌ ๊ณผ์ •"์„ ๊ฐ€์†ํ™” ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ „์˜ ์ ‘๊ทผ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

for (int i = 0; I < rigidBodies.Count; i++)
{
    for (int e = i; e < rigidBodies.Count; e++)
    {
        if (CheckBoundingBoxForOverlap(i, e))
            DetectNarrowPhase(i,e);
    }
}

 

๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ์ฒซ ๋ฒˆ์งธ Rigidbody๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ฒซ ๋ฒˆ์งธ Rigidbody๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๋‘ ๋ฒˆ์งธ Rigidbody๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์ง€๋งŒ..

๋งŒ์•ฝ 10x10x10 ์ถฉ๋Œ ๊ฐ์ง€ ๋˜๋Š” ํ๋ธŒ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ตœ์ƒ์˜ ๊ฒฝ์šฐ ์ˆ˜์ฒœ ๊ฐœ์˜ ์ถฉ๋Œ ๊ฐ€๋Šฅํ•œ ์Œ์„ ํ™•์ธํ•˜์—ฌ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข์€ ๋ฒ”์œ„์˜ ์ถฉ๋Œ ์ฒดํฌ๋Š” 0.25๋ฐฑ๋งŒ ๊ฐœ๋ฅผ ์ฒดํฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ž์—ฐ์ ์œผ๋กœ ๊ด‘์—ญ ๋ฒ”์œ„๋Š” O(n^2) ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ ์ด์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์†ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›น์—์„œ "๊ด‘์—ญ์ƒ ์ถฉ๋Œ ํƒ์ง€"๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด Sweep And Prune(SAP)์ ‘๊ทผ๋ฒ•์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ๋ณ€ํ˜•๋œ ๊ตฌํ˜„๋“ค์ด ์žˆ์ง€๋งŒ ๋ถ„๋ฅ˜ํ•œ ๋‹ค์Œ ๋‹ค๋“ฌ๋Š”๋‹ค(Prune)๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

SAP ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ "flavor"๋ฅผ ์ง€์†๋˜์ง€ ์•Š๋Š” ๋‹จ์ผ ์ถ• SAP์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

1. ๊ณต๊ฐ„ ์•ˆ์˜ ๋ชจ๋“  ๋ฌผ์ฒด๋“ค์€ "AxisList"๋ผ๋Š” ๋ชฉ๋ก ์•ˆ์— ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„์ƒ์ž์˜ ์‹œ์ž‘์„ ์ด์šฉํ•ด ํ•œ ๊ฐœ์˜ ์ถ•(์—ฌ๊ธฐ์„œ๋Š” X์ถ•)์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌผ์ฒด 5์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์ง€์ ์ด X์ถ•์„ ์ง์ ‘ ๋ณผ ๋•Œ ๋ฌผ์ฒด 6์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์ง€์ ๋ณด๋‹ค ๋” ์™ผ์ชฝ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. "ActiveList"๋ผ๋Š” ์ƒˆ๋กœ์šด ์ž„์‹œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์ž. ์ด์ œ "AxisList"์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ณด๊ณ  "ActiveList"์˜ ๋ชจ๋“  ํ•ญ๋ชฉ๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.(ํ˜„์žฌ๋Š” ๋‹จ ํ•˜๋‚˜) ๋งŒ์•ฝ ์ƒˆ ํ•ญ๋ชฉ์˜ ์™ผ์ชฝ์ด ๋” ํฌ๋ฉด ํ˜„์žฌ "ActiveList"์˜ ์˜ค๋ฅธ์ชฝ ํ•ญ๋ชฉ์ด ์ œ๊ฑฐ๋˜๊ณ  "ActiveList"์—์„œ ํ˜„์žฌ "ActiveList" ์•„์ดํ…œ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ "AxisList" ํ•ญ๋ชฉ๊ณผ ํ˜„์žฌ "ActiveList" ํ•ญ๋ชฉ ๊ฐ„์˜ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ƒˆ ํ•ญ๋ชฉ ์ž์ฒด๋ฅผ "ActiveList"์— ์ถ”๊ฐ€ํ•˜๊ณ  "AxisList"์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ถœ์ฒ˜ : https://github.com/mattleibow/jitterphysics/wiki/Sweep-and-Prune

 

์ด ์ ‘๊ทผ๋ฒ•์ด ์ง€์†์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์ •๋ ฌ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ํ”„๋ ˆ์ž„์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ(quicksort ์„ฑ๋Šฅ์ด ์ข‹๋‹ค) ํ•œ ์ถ•(์—ฌ๊ธฐ์—์„œ๋Š” X์ถ•)์— ๋Œ€ํ•ด ์ •๋ ฌ๋œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์žฅ๋ฉด์˜ ์ผ๊ด€์„ฑ์„ ์ด์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.(ํ•œ ํ”„๋ ˆ์ž„์—์„œ ์žฅ๋ฉด์ด ๋งŽ์ด ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค)

์†๋„ ํ–ฅ์ƒ์€ ์–ด๋””์„œ ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ์ผ๊นŒ?

์ •๋‹ต์€ ์ถฉ๋Œ ํƒ์ง€๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์ „ ๋ถ„๋ฅ˜๋œ ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰์€ O(nlog(n)) ๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค.

์ด ์‰ฌ์šด ์ ‘๊ทผ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฌด์ฐจ๋ณ„ ํž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(brute force algorithm)์— ๋น„ํ•ด ์—„์ฒญ๋‚œ ์†๋„ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

JigLib (Danny Chapman์ด ๋งŒ๋“  ์ฝ”๋“œ)์—์„œ C # (JigLibX)๋กœ ์ด์‹๋˜์—ˆ์„ ๋•Œ, JigLib์˜ ์›๋ž˜ ๋ฒ„์ „์€ ๋ฌด์ฐจ๋ณ„์ ์ธ ํž˜๊ณผ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๊ทธ๋ฆฌ๋“œ ์ ‘๊ทผ๋ฒ•์„ ํฌํ•จํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์กด ์™€ํŠธ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ฝ”๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— SAP ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ–ˆ๋Š”๋ฐ, ์ด๋Š” ๋ณต์žกํ•œ ๊ทธ๋ฆฌ๋“œ ์ ‘๊ทผ๋ฒ•์„ ์‰ฝ๊ฒŒ ๊ทน๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์ฝ”๋“œ๋Š” ์ด๋ฏธ ๊ฝค ์ž˜ ์ˆ˜ํ–‰๋˜์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  X์ถ•์—์„œ ๋ชจ๋“  ๋ฌผ์ฒด๊ฐ€ ๊ฒน์น˜๋ฉด ๋Ÿฐํƒ€์ž„์€ ๋‹ค์‹œ O (n *2)์ด๋‹ค.

(๋”ฐ๋ผ์„œ, ๋Œ€๋ถ€๋ถ„์˜ ๋ฌผ์ฒด๊ฐ€ ๊ทธ๊ณณ์—์„œ ๊ฒน์น˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ„๋ฆฌ ์ถ•์œผ๋กœ up-์ถ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค)

 

Sweep and Prune์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋” ๋ณต์žกํ•œ(๊ทธ๋ฆฌ๊ณ  ๋” ๋น ๋ฅธ) ์ ‘๊ทผ๋ฒ•์€ ์™„์ „ํ•œ 3์ถ• ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฌผ์ฒด๊ฐ€ ์ถฉ๋Œํ•˜๋ฉด ์„ธ ์ถ• ๋ชจ๋‘ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค (๋ถ„๋ฆฌ ์ถ• ์ •๋ฆฌ).

์ง€์†์  3Axis SAP๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐœ์˜ ๋ชฉ๋ก (๊ฐ ์ถ• 1์— ๋Œ€ํ•ด)์„ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฝ์ž… ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ๋œ ๋ชฉ๋ก์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์‚ฝ์ž… ์ •๋ ฌ์€ ๊ฑฐ์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก์—์„œ O(n)์ž…๋‹ˆ๋‹ค.

์‚ฝ์ž… ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์Šค์™‘์€ ๊ฐœ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๋ณธ์ฒด์™€ ์ค‘์ฒฉ๋˜๊ธฐ ์‹œ์ž‘/์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•œ ๊ฐœ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๊ฒน์ณ์„œ ๋ณด๊ด€ํ•˜๊ณ , ๊ฐ ํ”„๋ ˆ์ž„์€ ์‚ฝ์ž…๊ตฌ์—ญ์„ ํ•˜๊ณ , ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋ณด๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

 

Jitter์˜ ์ ˆ์ฐจ

private void SortAxis(List<SweepPoint> axis)
{
    for (int j = 1; j < axis.Count; j++)
    {
        SweepPoint keyelement = axis[j];
        float key = keyelement.Value;
        
        int i = j - 1;
        
        while (i >= 0 && axis[i].Value > key)
        {
            SweepPoint swapper = axis[i];
            
            if (keyelement.Begin && !swapper.Begin)
            {
                if (CheckBoundingBoxes(swapper.Body, keyelement.Body))
                {
                    lock (fullOverlaps)
                    {
                        fullOverlaps.Add(new BroadphasePair(swapper.Body, keyelement.Body));
                    }
                }
            }
            
            if (!keyelement.Begin && swapper.Begin)
            {
                lock (fullOverlaps) 
                {
                    fullOverlaps.Remove(new BroadphasePair(swapper.Body, keyelement.Body));
                }
            }
            
            axis[i + 1] = swapper;
            i = i - 1;
        }
        axis[i + 1] = keyelement;
    }
}
 

 

๋งŒ์•ฝ ๋‹น์‹ ์ด ์ „ํ˜•์ ์ธ SAP ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์„ธ๋ถ€์‚ฌํ•ญ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด, ๋‚˜๋Š” ํ”ผ์—๋ฅด ํ…Œ๋ฅด๋””๋งŒ์ด ์“ด ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ฝ์„ ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ฐ ํ”„๋ ˆ์ž„์— "A๊ฐ€ ์ถ• C์—์„œ B์™€ ๊ฒน์นœ๋‹ค"๋Š” ์ •๋ณด๋‚˜ "A๊ฐ€ ์ถ• C์—์„œ B์˜ ์ค‘์ฒฉ์„ ์ค‘์ง€ํ–ˆ๋‹ค"๋Š” ์ •๋ณด๋งŒ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด X, Y ๋˜๋Š” Z์ถ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ ์ด๊ฒƒ์„ ์‹œํ–‰ํ–ˆ์„ ๋•Œ, ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ฐ›๋Š” ๊ฐ’์‹ผ ๊ฒฐ๊ณผ์— ๋งค์šฐ ๋งŒ์กฑํ–ˆ๊ณ , ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์‹ค์ˆ˜๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ์Œ์ด ์–ผ๋งˆ๋‚˜ ์ค‘๋ณต๋˜๋Š”์ง€๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒน์น˜๋Š” ํšŸ์ˆ˜๊ฐ€ 3ํšŒ(๋ชจ๋“  ์ถ•์—์„œ ๊ฒน์น˜๋Š” ํšŸ์ˆ˜๊ฐ€ 1ํšŒ์ž„์„ ์˜๋ฏธ)์ธ ๊ฒฝ์šฐ, ๋ฌผ์ฒด๋Š” ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ์ถ•์— ๊ฒน์น˜๋Š” ์Œ์˜ ์ˆ˜๋Š” ๋งค์šฐ ๋†’์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋ณต ๊ณ„์ˆ˜ = 1์ธ ์ˆ˜์ฒœ ๊ฐœ์˜ ์ž ์žฌ์  ๊ฒน์น˜๋Š” ์Œ์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์ง€ ๋ช‡ ๊ฐœ๋งŒ ๋‘ ๋ฒˆ์งธ ์ถ•์— ๊ฒน์น˜๊ณ  ๊ฒน์น˜๋Š” ํšŸ์ˆ˜๊ฐ€ 2์ด๊ณ , ์„ธ ๋ฒˆ์งธ ์ถ•์— ๊ฒน์น˜๋Š” ํšŸ์ˆ˜๋Š” 3์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋Ÿฐํƒ€์ž„์€ O(nlogn)์˜€์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ O(n^2)์ด์—ˆ๋‹ค(๋‚ด ์‚ฌ์ „ ๊ตฌ์กฐ๋ฅผ ์ฃฝ์ด๋Š” ๊ฒƒ)

์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ๋งˆ๋ผ.

ํ•œ ์ถ•์ด ์ค‘์ฒฉ์„ ๋ณด๊ณ ํ•˜๋Š” ๊ฒฝ์šฐ ์ €๋ ดํ•œ ์ „์ฒด ๊ฒฝ๊ณ„ ์ƒ์ž ํ™•์ธ – ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ ํ•ด๋‹น ์Œ์„ ํ’€์˜ค๋ฒ„๋žฉ์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

ํ•œ ์ถ•์— ๋‘ ๊ฐœ์˜ ๋ชธ์ฒด๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋ณด๊ณ ๋œ ๊ฒฝ์šฐ, ํ’€์˜ค๋ฒ„๋žฉ์—์„œ ์Œ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. (์ด๊ฒƒ์€ ์œ„์˜ ์ฝ”๋“œ๋กœ ํ–‰ํ•ด์ง„๋‹ค.) ๋”ฐ๋ผ์„œ SAP์— ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‹ค์‹œ O(n)์— ์ง€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

("CollisionSystemPersistent"์—์„œ Jitter์˜ ๊ตฌํ˜„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ) SAP.cs".)

 

์ง€์†์ ์ธ Sweep and Prune ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋‹จ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋งŽ์€ ๋น„ํ™œ์„ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„ ์ •๋ง ํฐ ์„ธ๊ณ„๋ฅผ ๊ฒฝํ—˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด์•Œ์ด ์ •์ ์ธ ๋ฌผ์ฒด๊ฐ€ ๋งŽ์€ ๋งˆ์„์„ ๊ด€ํ†ตํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•ด๋ณด๋ผ.

๊ฐ ๋ฌผ์ฒด(์ดํƒ„์œผ๋กœ๋ถ€ํ„ฐ ์ˆ˜๋งˆ์ผ ๋–จ์–ด์ ธ ์žˆ์–ด๋„)์™€ ํƒ„ํ™˜ ์ž์ฒด ์‚ฌ์ด์— ๊ตํ™˜์ด ์žˆ๋‹ค

์ด ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋“œ(๊ด‘๋ฒ”์œ„ ๋‹จ๊ณ„)๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์†Œํ˜• SAP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ด‘์„ ๊ณผ ๊ฒฝ๊ณ„ ์ƒ์ž ์งˆ์˜๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ ˆ์ด์บ์ŠคํŒ…์˜ ๊ฒฝ์šฐ, ์ •๋ ฌ๋œ ์„ธ ๊ฐœ์˜ ๋ชฉ๋ก์€ ๊ท ์ผํ•˜์ง€ ์•Š์€ ๋ณต์…€ ๊ทธ๋ฆฌ๋“œ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ฃผ๋ฌธํ•œ ๋ ˆ์ด ์ฟผ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ๋Š” ๋‹ค์†Œ ๋Š๋ฆฌ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๋งŽ์€ ๋ณต์…€ ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋น„์–ด ์žˆ๊ณ  ์ดˆ๊ธฐ ํƒ€๊ฒฉ์„ ๋ฐ›์€ ๊ด‘์„ ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹จ์ง€ ๊ฐ ๋ฌผ์ฒด์— ๋Œ€ํ•ด ๊ฑฐ์นœ ํž˜ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ข…์ข… ๋” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์žฅ๋ฉด์— ํ•˜๋‚˜์˜ ํฐ ๋ฌผ์ฒด(๋Œ€๊ฐœ ์ง€๋ฉด์ด๋‚˜ ๋ ˆ๋ฒจ)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด ๊ฐœ์ฒด์˜ ๋์ ์€ ์™„์ „ํžˆ ์™ผ์ชฝ์— ์žˆ๊ณ  ๋ชฉ๋ก ์˜ค๋ฅธ์ชฝ์— ์žˆ๋‹ค.

์Šค์œ„ํ”„ ํฌ์ธํŠธ์— ์ €์žฅ๋œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ๊ฐœ์ฒด๊ฐ€ ํ›จ์”ฌ ๋” ํฐ ์—”ํ‹ฐํ‹ฐ์˜ ๋์ ์— ์˜ํ•ด ๋‘˜๋Ÿฌ์‹ธ์ด๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

์†Œ์ผ“์ด๋ž€

-TCP/IP๋กœ ํ†ต์‹ ํ•˜๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ€์ง€๋Š” ๋„คํŠธ์›Œํฌ ๋‚ด์˜ ์ฃผ์†Œ์ธ IP address,IP address์˜ ์„œ๋ธŒ address์ธ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์กฐํ•ฉํ•œ Network address

-๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์˜ ํ†ต์‹ ๋ฐฉ๋ฒ•

-๋„คํŠธ์›Œํฌ์ƒ์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋‘๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ํŠน์ •ํฌํŠธ๋ฅผ ํ†ตํ•ด ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์žฅ์น˜

-๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๋‘๊ฐœ์˜ ํ˜ธ์ŠคํŠธ(host)๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ๋งค๊ฐœ์ฒด ์—ญํ• 

-์†Œ์ผ“์€ ๋ฐ˜๋“œ์‹œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด์„œ ํ†ต์‹ ์„ ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹˜

-์œ ๋‹‰์Šค ๊ณ„์—ด์˜ ์‹œ์Šคํ…œ์—์„œ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์˜ ํ”„๋กœ์„ธ์Šค๋“ค๋ผ๋ฆฌ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ

๋ฐ˜์‘ํ˜•
728x90

ํ”„๋กœํ† ์ฝœ์ด๋ž€

์ •๋ณด๊ธฐ๊ธฐ ์‚ฌ์ด์—์„œ ์ •๋ณด๊ตํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ด๋ฅผ ์›ํ™œํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ •ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ†ต์‹ ๊ทœ์น™๊ณผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•ฝ์†

์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ์ข…์ด ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๋Š” ํ†ต์‹ ๊ทœ์•ฝ๋„ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ข…์ด ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๊ฐ„์— ์ •๋ณดํ†ต์‹ ์„ ํ•˜๋ ค๋ฉด ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์„ ์„ค์ •ํ•˜์—ฌ ํ†ต์‹ ๋ง์„ ๊ตฌ์ถ•ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์˜ ์˜ˆ๋Š” ์ธํ„ฐ๋„ท์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” TCP/IP๊ฐ€ ์ด์— ํ•ด๋‹น๋œ๋‹ค.

 

ํ”„๋กœํ† ์ฝœ์— ํฌํ•จ๋˜์–ด์•ผ ํ•  ๋ชฉ๋ก

์˜ค๋ฅ˜์ œ์–ด,๋™๊ธฐ,ํ๋ฆ„์ œ์–ด,์ฝ”๋“œ๋ณ€ํ™˜,์ „์†ก์†๋„,ํ†ต์‹ ํ•˜๋Š” ์ƒ๋Œ€๋ฐฉ์˜ ์œ„์น˜์— ๋”ฐ๋ผ ํ†ต์‹  ๊ฐœ์ฒด๊ฐ€ ์–ด๋Š OSI ๊ณ„์ธต์— ์žˆ๋Š” ๊ฐ€,ํšจ์œจ์ ์ธ ์ •๋ณด์ „์†ก์„ ์œ„ํ•œ ๊ธฐ๋ฒ•,์ •๋ณด์˜ ์•ˆ์ „์„ฑ(๋ณด์•ˆ)์— ๊ด€ํ•œ ์•ฝ์†

๋ฐ˜์‘ํ˜•
728x90

 

์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์ž!

 

 

์ด๋Ÿฐ ์ฐฝ์ด ๋œจ๋ฉด Win32 ์ฝœ์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ฒƒ์ด๋‹ค.

์ด๋ฆ„์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์ด ๋ฐ”๋€Œ๊ณ  ์œ„์น˜๋Š” ์ž์‹ ์ด ์„ค์ •ํ•ด์ฃผ๊ณ  ์‹ถ์€ ๊ณณ์— ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

(์ฐธ๊ณ ๋กœ ์ด๋ฆ„๊ณผ ์†”๋ฃจ์…˜ ์ด๋ฆ„์€ ๋™์ผํ•˜๊ฒŒ ์ž๋™์œผ๋กœ ์ž…๋ ฅ๋œ๋‹ค.)

 

ํ™•์ธ์„ ๋ˆ„๋ฅด๊ณ  ๊ทธ๋‹ค์Œ ๋œจ๋Š” ์ฐฝ์—์„œ ๋‹ค์Œ์„ ๋˜ ๋ˆŒ๋Ÿฌ์ฃผ์ž.

 

 

์ด๋Ÿฌํ•œ ์ฐฝ์ด ๋œจ๊ฒŒ ๋˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๋นˆ ํ”„๋กœ์ ํŠธ์ด๊ธฐ์— ๋นˆํ”„๋กœ์ ํŠธ๋ฅผ ์ฒดํฌํ•˜๊ณ  ๋งˆ์นจ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ์ƒ์„ฑ๋œ๋‹ค.

 

 

์ž ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์†”๋ฃจ์…˜ ํƒ์ƒ‰๊ธฐ์— ๋‚ด๊ฐ€ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ๋œจ๊ฒŒ ๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์—์„œ

 

[์†Œ์ŠคํŒŒ์ผ] ์šฐํด๋ฆญ -> ์ถ”๊ฐ€ -> ์ƒˆ ํ•ญ๋ชฉ ์„ ๋ˆŒ๋Ÿฌ์ฃผ์ž

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด๋Ÿฌํ•œ ์ฐฝ์ด ๋œจ๊ฒŒ ๋˜๋Š”๋ฐ

 

C++ ํŒŒ์ผ ์„ ํด๋ฆญํ•ด๋†“๊ณ  ์ด๋ฅธ์—๋Š” ์†Œ์Šค์ด๋ฆ„(์†Œ์Šค์ด๋ฆ„์€ ๊ผญ ์˜์–ด๋กœ ๋งŒ๋“ค๋„๋ก ํ•˜์ž).c ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

์†Œ์Šค์ด๋ฆ„.cpp ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด C์–ธ์–ด๊ฐ€ ์•„๋‹Œ C++์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ ํ™•์žฅ์ž๋Š” ๊ผญ .c๋กœ ๋งŒ๋“ค์–ด์ฃผ๋„๋ก ํ•˜์ž.

 

 

์•ผ์ƒ์˜ ๋นˆ ์†Œ์ŠคํŒŒ์ผ์ด ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์กŒ๋‹ค!

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ˆ˜ํ•™์˜ ์ง‘ํ•ฉ๋‹จ์›๊ณผ ๊ฐ™์€ C์–ธ์–ด์˜ Hello,World! ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด์ž.

 

 

์ด๋ ‡๊ฒŒ ์ ์—ˆ์œผ๋ฉด Ctrl+F5 ๋ฒˆ์„ ๋ˆŒ๋Ÿฌ์„œ ์†”๋ฃจ์…˜์„ ๋นŒ๋“œํ•ด๋ณด์ž.

 

 

์ด๋Ÿฐ ์ฐฝ์ด ๋–ณ๋‹ค๋ฉด ์„ฑ๊ณตํ•œ๊ฒƒ์ด๋‹ค. (ํ•œ๊ธ€ ์œˆ๋„์šฐ์—์„œ๋Š” "๊ณ„์†ํ•˜๋ ค๋ฉด ์•„๋ฌด ํ‚ค๋‚˜ ๋ˆ„๋ฅด์‹ญ์‹œ์˜ค..." ์ผ๊ฒƒ์ด๋‹ค.)

 

 

ํ•œ๊ธ€์„ ์ ์–ด๋„ ์ž˜ ์ถœ๋ ฅ๋œ๋‹ค.

 

์Œ ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์ฐฝ์˜ ์ƒ‰๊น”์ด ํฐ์ƒ‰์ธ๊ฒŒ ๋งˆ์Œ์— ์•ˆ๋“ ๋‹ค ์‹ถ์œผ๋ฉด ์ฐฝ์—์„œ ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ์„ ํ•˜๋ฉด

 

 

์—ฌ๊ธฐ์„œ Properties(์†์„ฑ)์— ๋“ค์–ด๊ฐ€๋ณด์ž.

 

 

์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์†์„ฑ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค!

 

 

๋ฐ˜์‘ํ˜•
728x90

*C์–ธ์–ด๋Š” ์ ˆ์ฐจ์ง€ํ–ฅ์  ํŠน์„ฑ์„ ์ง€๋‹Œ๋‹ค.

C์–ธ์–ด๋Š” ์ •ํ•ด์ง„ ์ˆœ์„œ์˜ ์‹คํ–‰ํ๋ฆ„์„ ์ค‘์‹œํ•œ๋‹ค. ์ ˆ์ฐจ์ง€ํ–ฅ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์กฐ๊ธˆ๋งŒ ๊ณต๋ถ€ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

*C์–ธ์–ด๋กœ ๊ตฌํ˜„๋œ ํ”„๋กœ๊ทธ๋žจ์€ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ๊ณ , ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ์š”์†Œ๋“ค์„ ์ตœ์†Œํ™”ํ•œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ฐ˜์‘ํ˜•
728x90

๊นŒ๋จน์ง€ ๋ง๊ณ  ๋ณต์Šตํ•˜์ž STL์€ ๊ฝค๋‚˜ ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด STL์€ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ž‘์„ฑ๋œ ๋งŽ์€ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์ปจํ…Œ์ด๋„ˆ,iterator,์•Œ๊ณ ๋ฆฌ์ฆ˜๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

 

- ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฅ˜

 ํด๋ž˜์Šค

ํ—ค๋” 

 vector

<vector> 

deque

<deque> 

list

<list> 

set

<set> 

map

<map> 

 stack

<stack> 

 queue

<queue> 

- iterator ์ข…๋ฅ˜

 ์ข…๋ฅ˜

iterator 

 const_iterator

 reverse_iterator

 const_reverse_iterator

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

copy 

 merge

 random

 rotate

 equal

 min

 remove

 search

 find

 move

 replace

 sort

 max 

partition

 reverse

 swap

 

๋ฐ˜์‘ํ˜•
728x90

์•„๋ฌด๋ž˜๋„ ์ด์ „์— ์˜ฌ๋ ธ๋˜ ๊ฒƒ๋“ค์€ ์ˆ˜์—…์‹œ๊ฐ„์— ๊ต์ˆ˜๋‹˜์˜ ๋„์›€์„ ๋ฐ›์•„ ํ–ˆ๋˜ ๊ฒƒ๋“ค์ธ๋ฐ

๊ฝค ์ ์ง€ ์•Š์€ ๋ถ„๋“ค์ด openGL์— ๋Œ€ํ•ด ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๊ณต๋ถ€๋„ ํ• ๊ฒธ ๋‚ด๊ฐ€ ์ง์ ‘ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ž๋ฃŒ๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ์„œ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ผ๋‹จ ๋‚˜๋Š” VisualStudio 2017์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  main.cpp๋ฅผ ์†Œ์Šค ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ 

ํ”„๋กœ์ ํŠธ(P) → ์†์„ฑ(P) ์„ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ์†์„ฑ์„ ํ‚จ๋‹ค.

 

 

 

1. C/C++ → ์ผ๋ฐ˜ → ์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ

2. ๋ง์ปค → ์ผ๋ฐ˜ → ์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ

3. ๋ง์ปค → ์ž…๋ ฅ → ์ถ”๊ฐ€ ์ข…์†์„ฑ

์— GLFW์™€ gl3w๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

GLFW ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : https://www.glfw.org/

 

GLFW๋Š” ๋ฐ์Šคํฌํƒ‘์—์„œ OpenGL, OpenGL ES ๋ฐ Vulkan ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ๋‹ค์ค‘ ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
์ฐฝ, ์ปจํ…์ŠคํŠธ ๋ฐ ํ‘œ๋ฉด ์ƒ์„ฑ, ์ž…๋ ฅ ๋ฐ ์ด๋ฒคํŠธ ์ˆ˜์‹ ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ API๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.
glfwinit(), glfwCreateWindow() ๋“ฑ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

 

gl3w ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : https://github.com/skaslev/gl3w (cmake ์ด์šฉํ•ด์„œ ๋นŒ๋“œํ•ด์•ผํ• ๋“ฏ)

 

gl3w๋Š” glew๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ glew๋Š” ์˜›๋‚  ๋ฒ„์ „์˜ OpenGL๊นŒ์ง€ ์ง€์›ํ•œ๋‹ค.
gl3w ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” OpenGL 3์™€ 4์˜ ์ฝ”์–ด ํ”„๋กœํŒŒ์ผ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค.

 

๋งŒ์•ฝ LNK2001 ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ˆ gl3w.c ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ์•ˆ์— ์†Œ์Šค๋กœ ์ถ”๊ฐ€ํ•˜์ž. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ฐพ์€ ๋งํฌ

 

 

 

 

main์— ๊ธฐ๋ณธํ˜•์„ ์ ์–ด์ฃผ๊ณ (https://www.khronos.org/opengl/wiki/OpenGL_Loading_Library#GL3W ์„ ์ฐธ๊ณ ํ•จ)

 

๊ทธ๋ฆฌ๊ณ  

#include <GL/gl3w.h> #include <GLFW/glfw3.h>

์ด๋ถ€๋ถ„์€ ๊ผญ ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ ์ง€ ๋ง๊ณ  ๋˜‘๊ฐ™์ด ์ ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผํ•ด๋ณด๋ฉด

 

 

 

์ด ์ฐฝ์ด ๋œจ๋ฉด ์ •์ƒ์ด๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฉด ๋‹ค์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋˜์ง„ ์•Š์•˜๋Š”์ง€,  64๋น„ํŠธ 32๋น„ํŠธ ์ž˜ ํ™•์ธํ–ˆ๋Š”์ง€ ํ•œ๋ฒˆ ๋” ์ฒดํฌํ•ด๋ณด์ž.

ํ•„์ž๋Š” ์˜คํ”ˆ์†Œ์Šค์ธ ImGUI๋ฅผ ์ด์šฉํ•˜์—ฌ์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์ฐธ๊ณ  ๋งํฌ : https://github.com/ocornut/imgui

๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋„ฃ๋Š”๋‹ค.

ImGUI๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ์ž์ฒด์ ์œผ๋กœ ์ œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ํ†ต์งœ๋กœ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋‚ด๋ถ€์— ๋„ฃ์–ด์„œ ๋นŒ๋“œํ•˜๋ฉด ๋œ๋‹ค.

๋‚˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘ ์•„๋ž˜ ๋งํฌ์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋”ฐ๋ผ์„œ ์ œ์ž‘ํ•ด์„œ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

https://swstar.tistory.com/229#gref

 

๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค C/C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค์—์„œ C์–ธ์–ด ๋˜๋Š” C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ์ž‘ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ •์  (static) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์  (dynamic) ๋ผ์ด๋ธŒ๋Ÿฌ

swstar.tistory.com

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •์ด ๋๋‚˜๋ฉด

https://github.com/ocornut/imgui/blob/master/examples/opengl3_example/main.cpp

์ด ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด imgui์™€ glfw3,gl3w์— ๊ด€ํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์„ ์กฐ๊ธˆ ์ฐธ๊ณ ํ•˜์—ฌ์„œ ๋„ฃ์–ด๋ณด์ž.

 

--------------------------------------------------------------------------------------------------------------

์ตœ๊ทผ์— ๋‹ค์‹œ ๋“ค์–ด๊ฐ€๋ณด๋‹ˆ ๋ช‡๊ฐ€์ง€ URL๋„ ์‚ฌ๋ผ์ง€๊ณ  ํ•ด์„œ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์“ฐ๊ธธ ๋ฐ”๋ž€๋‹ค.

์•„๋ฌด๋ž˜๋„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž์ฃผ ํ•˜์‹œ๋‹ค ๋ณด๋‹ˆ ๋ฐฉ๋ฒ•์„ ๋ฐ”๊พผ๋“ฏ ํ•œ๋ฐ

๊ฐ„๋‹จํ•˜๊ฒŒ https://github.com/ocornut/imgui ์—ฌ๊ธฐ์„œ ์ดˆ๋ก์ƒ‰ Code ๋ฒ„ํŠผ -> download Zip -> ์••์ถ•ํ•ด์ œ ํ›„ imgui ๊ด€๋ จ ์†Œ์Šค๋“ค์„ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ์‹œ์ผœ์„œ ์ง„ํ–‰ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๋‚˜๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ImGUI ์†Œ์Šค๋“ค์„ ์ถ”๊ฐ€ํ•˜์˜€๊ณ  ์†์„ฑ๋“ค์„ ๋‹ค์‹œ ์žฌ์„ค์ •ํ•˜์˜€๋‹ค.

glfw ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์†์„ฑ์— ์ถ”๊ฐ€ํ•˜์—ฌ์ฃผ์—ˆ๊ณ 

glviewport, glclearcolor, glclear ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” LNK2019 ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ์—๋Š”

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ ์ข…์†์„ฑ์— glfw3.lib์™€ opengl32.lib๋ฅผ ๋„ฃ์–ด๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.

 

opengl3_loader.h์˜ ๊ฒฝ์šฐ ํ˜„์žฌ gl3w.h์˜ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๋•ก๊ฒจ์„œ ์˜ค๋ฏ€๋กœ ๋‚˜์ค‘์— gl3w.lib๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋•ก๊ฒจ์˜ค๋Š” ๊ฒฝ์šฐ ์žฌ์ •์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

https://github.com/ocornut/imgui/issues/4445

 

OpenGL backend now embeds its own GL loader (imgui_impl_opengl3_loader.h) · Issue #4445 · ocornut/imgui

TL;DR; Our GL backend now embed its own minimal GL loader (embedded file; full source repo) User/application don't need to configure anything related to GL loader. User/application can use their ow...

github.com

์œ„์˜ ๋งํฌ๋Š” ํ•ด๋‹น ์—๋Ÿฌ์— ๋Œ€ํ•œ imgui ์ œ์ž‘์ž๊ฐ€ ๋‹ต๋ณ€ํ•œ ๊ฒฝ์šฐ์ด๋ฉฐ gl3w_stripped๋ผ๋Š” ํŒŒ์ผ์„ ์ œ์ž‘ํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถฉ๋Œ์‹œํ‚ค์ง€ ์•Š๊ฒŒ๋” ๋งŒ๋“ค๋ผ๋Š” ๊ฒƒ์ธ๋ฐ

https://github.com/dearimgui/gl3w_stripped

 

GitHub - dearimgui/gl3w_stripped: Simple OpenGL core profile loading, customized for Dear ImGui

Simple OpenGL core profile loading, customized for Dear ImGui - GitHub - dearimgui/gl3w_stripped: Simple OpenGL core profile loading, customized for Dear ImGui

github.com

๋‚˜์˜ ๊ฒฝ์šฐ cmake๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์„œ ๋Œ๋ฆฌ๋‹ˆ๊นŒ imgui_loader.h์— ํ•„์š”ํ•œ gl3w ํŒŒ์ผ๋“ค์ด ์ œ์ž‘๋˜์–ด์„œ gl3w.h ํ—ค๋”ํŒŒ์ผ ๋Œ€์‹  imgui_impl_opengl3_loader.h ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

 

https://github.com/ocornut/imgui/blob/master/examples/example_glfw_opengl3/main.cpp

์ด ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ main ํ•จ์ˆ˜๋ฅผ ์ œ์ž‘ํ•˜์˜€๋‹ค.

 

๋ณธ ํ™”๋ฉด์ด ๋–ณ๋‹ค๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค. ์•ž์œผ๋กœ ์ด ImGUI์™€ ํ•จ๊ป˜ openGL์„ ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜์ž!

 

์ด์— ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ ํ• ๋งŒํ•œ ์‚ฌ์ดํŠธ์˜ ๋งํฌ๋“ค์„ ์ข€ ๋‚จ๊ฒจ๋†“๊ฒ ์Šต๋‹ˆ๋‹ค

์ €๋„ ์ œ ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๋ฉด ์•„๋งˆ ํฌ์ŠคํŒ…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค~!

 

LearnOpenGL

learnopengl.com/

 

Learn OpenGL, extensive tutorial resource for learning Modern OpenGL

Welcome to OpenGL Welcome to the online book for learning OpenGL! Whether you are trying to learn OpenGL for academic purposes, to pursue a career or simply looking for a hobby, this book will teach you the basics, the intermediate, and all the advanced kn

learnopengl.com

LearnOpenGL ๋ฒˆ์—ญ ๋ธ”๋กœ๊ทธ

heinleinsgame.tistory.com/4

 

[Learn OpenGL ๋ฒˆ์—ญ] 2-1. ์‹œ์ž‘ํ•˜๊ธฐ - OpenGL

OpenGL ์‹œ์ž‘ํ•˜๊ธฐ/OpenGL ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋จผ์ € OpenGL์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. OpenGL์€ ๊ทธ๋ž˜ํ”ฝ ๋ฐ ์ด๋ฏธ์ง€๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋Š” API( Application Programming Interface )๋ผ..

heinleinsgame.tistory.com

 

 

 

 

P.S ํ˜น์—ฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋˜๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ์‚ฌํ•ญ์€ ๊ฐ€๋ฅด์ณ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

Chapter 1. Ubuntu์—์„œ mariadb ์‹คํ–‰์„ ํ•˜์—ฌ๋ณด์ž.

*๋ชจ๋“  ์‹คํ–‰์€ MariaDB 5.5์—์„œ ์ž‘๋™ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค

mariadb๋ฅผ ๋‹ค ์„ค์น˜ํ•˜์…จ์œผ๋ฉด ํ•œ๋ฒˆ ์‹คํ–‰ํ•ด๋ณผ๊นŒ์š”? ๋จผ์ € Ubuntu ํ™”๋ฉด์—์„œ terminal์„ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

 

 

 

 

 

์ด๋Ÿฌํ•œ ์‹คํ–‰์ฐฝ์ด ๋–ด๋‹ค๋ฉด ์„ฑ๊ณตํ•˜์‹ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์œผ๋กœ๋Š” mariadb๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๊ธฐ ์œ„ํ•ด ๋ช…๋ น์–ด๋ฅผ ์ ์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ mariadb๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด mariadb –u root –p ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์˜€๋”๋‹ˆ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

mysql –u root –p ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์˜€๋”๋‹ˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜ค๊ณ  ์ดˆ๊ธฐ์— ์„ค์ •ํ•˜์˜€๋˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด 'Welcome to the MariaDB monitor' ๋ผ๋Š” ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜ mairaDB๊ฐ€ ๊ตฌ๋™๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

.

 

Chapter 2. ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

mariaDB๋„ ์ž˜ ๊ตฌ๋™๋˜๋‹ˆ ์ง€๊ธˆ๋ถ€ํ„ฐ ๋‚˜๋งŒ์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ํšŒ์› ๊ด€๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์€ 'membership' ์œผ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

mariadb์—์„œ๋Š” mysql์—์„œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2.1 CREATE

MariaDB[(none)]> create database (๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„);

 

 

create ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•œ ๊ฐœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

2.2 SHOW

MariaDB[(none)]> show databases;

 

 

 

show ๋ช…๋ น์–ด๋ฅผ ์“ฐ๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

๋ณด๋ฉด db1์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ membership์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค 2๊ฐœ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

2.3 DROP

MariaDB[(none)]> drop database (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„);

 

 

drop ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ db1๊ณผ membership ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์šด ๋ชจ์Šต์ด๋‹ค.

 

2.4 USE

MariaDB[(์„ ํƒ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)]> use (์„ ํƒํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„)

 

 

 

use๋ฅผ ์ด์šฉํ•ด์„œ ์–ด๋Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์“ธ ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„๊ณผ ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์ด ๋ช…์‹œ๋˜์–ด์•ผํ•œ๋‹ค.

 

2.5 ALTER

 

ALTER๋ฌธ์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋‚˜ ํ˜•์‹๋“ฑ์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋ž˜์˜ ๋ฌธ์žฅ์€ ํ…Œ์ด๋ธ” ์•ˆ์— ์นผ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฌธ์žฅ์ด๋‹ค.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> alter table (ํ…Œ์ด๋ธ” ์ด๋ฆ„) add (์นผ๋Ÿผ ์ด๋ฆ„) datetime null;

 

 

datetime not null์„ ํ•˜๊ฒŒ ๋˜๋ฉด

 

 

*์นผ๋Ÿผ ์ถ”๊ฐ€

-๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€: alter table ํ…Œ์ด๋ธ”๋ช… add column ์นผ๋Ÿผ์ด๋ฆ„ ์นผ๋Ÿผํƒ€์ž…

-์ง€์ • ์นผ๋Ÿผ ๋’ค์—: alter table ํ…Œ์ด๋ธ”๋ช… add column ์นผ๋Ÿผ์ด๋ฆ„ ์นผ๋Ÿผํƒ€์ž… after ์นผ๋Ÿผ์ด๋ฆ„

-์ œ์ผ ์•ž์—: alter table ํ…Œ์ด๋ธ”๋ช… add column ์นผ๋Ÿผ์ด๋ฆ„ ์นผ๋Ÿผํƒ€์ž… first

 

*์นผ๋Ÿผ ์‚ญ์ œ

alter table ํ…Œ์ด๋ธ”๋ช… drop column ์นผ๋Ÿผ์ด๋ฆ„

 

*์นผ๋Ÿผ ๋ณ€๊ฒฝ

alter table ํ…Œ์ด๋ธ”๋ช… modify ์นผ๋Ÿผ์ด๋ฆ„ ์ƒˆ์นผ๋Ÿผํƒ€์ž…

alter table ํ…Œ์ด๋ธ”๋ช… change ์นผ๋Ÿผ์ด๋ฆ„ ์ƒˆ์นผ๋Ÿผ์ด๋ฆ„ ์ƒˆ์นผ๋Ÿผํƒ€์ž…

 

 

 

*์ธ๋ฑ์Šค์— ์ƒˆํ•ญ๋ชฉ ์ถ”๊ฐ€

alter table ํ…Œ์ด๋ธ”๋ช… add index(์นผ๋Ÿผ์ด๋ฆ„)

 

 

 

*์ธ๋ฑ์Šค ์‚ญ์ œ

alter table ํ…Œ์ด๋ธ”๋ช… drop index ์นผ๋Ÿผ์ด๋ฆ„

drop index ์ธ๋ฑ์Šค์ด๋ฆ„ on ํ…Œ์ด๋ธ”๋ช…

 

*Primary key ์ง€์ •ํ•˜๊ธฐ

alter table ํ…Œ์ด๋ธ”๋ช… add constraint 'primary key์ด๋ฆ„' primary key(์นผ๋Ÿผ์ด๋ฆ„)

 

*Primary key ์‚ญ์ œ

alter table ํ…Œ์ด๋ธ”๋ช… drop primary key

 

 

Chapter 3. ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋ณด์ž

 

3.1 INSERT

 

ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ insert ๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. insert ๋ฌธ์žฅ์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋จผ์ € ํ…Œ์ด๋ธ”์ด ์กด์žฌ ํ•ด์•ผ ํ•œ๋‹ค.

 

*ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

 

id

name

age

 

 

 

 

๋งŒ์•ฝ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

MaiaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> create table (ํ…Œ์ด๋ธ” ์ด๋ฆ„)(

->id varchar(์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ธธ์ด),

->name varchar(์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ธธ์ด),

->age varchar(์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ธธ์ด)

->);

 

ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉด INSERT๋ฅผ ์ด์šฉํ•˜์—ฌ์„œ ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜์—ฌ๋ณด์ž.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> insert into (ํ…Œ์ด๋ธ” ์ด๋ฆ„) (id,name,age) values(๋„ฃ์„ ๊ฐ’,๋„ฃ์„ ๊ฐ’,๋„ฃ์„ ๊ฐ’);

 

5297734 KIM 22 ์„ ๋„ฃ์–ด๋ณด๋„๋ก ํ•˜์ž

 

 

INSERT INTO ... ON DUPLICATE KEY UPDATE ,,, ๋ผ๋Š” ํ˜•ํƒœ์˜ ๊ตฌ๋ฌธ์ด ์‚ฌ์šฉ๋˜๋ฉด ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ 

์ด๋ฏธ ์กด์žฌํ•  ๋•Œ์—๋Š” UPDATE๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ์—๋Š” INSERT๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

 

์ด ๊ตฌ๋ฌธ์—์„œ UPDATE๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  INSERT๊ฐ€ ์‹คํ–‰๋œ ์ด์œ ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ๋•Œ PRIMARY KEY๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์„ ๋‹ค์‹œ ๋งŒ๋“  ๋’ค ON DUPLICATE KEY UPDATE๋ผ๋Š” ์˜ต์…˜์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ์ง‘์–ด ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋‹น์—ฐํžˆ ์˜ค๋ฅ˜ ๋ฌธ๊ตฌ๋ฅผ ๋„์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> insert into ํ…Œ์ด๋ธ”์ด๋ฆ„ (...) values(...)

->onduplicate key update (๋ฐ”๋€Œ๋Š” ๊ฐ’)

 

 

 

3.2 SELECT

 

INSERT๋ฅผ ์ด์šฉํ•ด์„œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ์ง‘๊ณ  show๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚ด์šฉ์„ ๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ๋ณด์ด์ง€๊ฐ€ ์•Š๋Š”๋‹ค

ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” select ๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฆ„]> select *from (ํ…Œ์ด๋ธ” ์ด๋ฆ„)

 

๊ทธ๋Ÿฌ๋ฉด ์•„๊นŒ ๋งŒ๋“ค์–ด๋ดค๋˜ membershipํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋„๋ก ํ•˜์ž.

 

 

3.3 UPDATE

 

๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๋‹ค๋ฉด ๋ฐ”๊ฟ”์•ผ ํ•  ๋•Œ ์“ฐ๋Š” ๊ฒƒ์ด UPDATE ๋ฌธ์žฅ์ด๋‹ค

INSERT๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ , ๋ ˆ์ฝ”๋“œ์˜ ์ผ๋ถ€ ์นผ๋Ÿผ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ SQL๋ฌธ์žฅ์ด๋‹ค.

 

name์„ GAHYEON ์œผ๋กœ ๋ฐ”๊พธ์–ด๋ณด๊ฒ ๋‹ค.

 

MariaDB [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> update (ํ…Œ์ด๋ธ” ์ด๋ฆ„) set name='GAHYEON' where id=5297734;

 

 

*UPDATE ๋ฌธ์žฅ ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ 

WHERE ์กฐ๊ฑด์ ˆ์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ทธ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์นผ๋Ÿผ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค.

 

3.4 REPLACE

 

๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด INSERT๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” update๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

MariaDB [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฆ„]> replace (ํ…Œ์ด๋ธ” ์ด๋ฆ„) set age=20, id=5297734;

 

 

๊ทธ๋Ÿฌ๋‚˜ ์ด ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์“ฐ๋ ค๊ณ  ๋ดค๋”๋‹ˆ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๋Œ€๋กœ ๋‚˜์˜ค์ง€๊ฐ€ ์•Š์•˜๋‹ค

์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ INSERTํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•˜์˜€๋Š”๋ฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ 3๊ฐœ์ธ ํ…Œ์ด๋ธ”์—์„œ๋Š” ์ค‘๊ฐ„ ๊ฐ’์ด null๋กœ ๋“ค์–ด๊ฐ€๊ณ  ์•ž์˜ ์นผ๋Ÿผ์ด ์‚ญ์ œ ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ INSERT๊ฐ€ ๋˜์—ˆ๋‹ค

๊ทธ๋ž˜์„œ ์ธ์ž ๊ฐ’์ด ๋ชจ์ž๋ผ์„œ ๊ทธ๋ ‡๊ฒŒ ๋œ ๊ฒƒ์ธ๊ฐ€? ๋ผ๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณด์•˜๋‹ค.

 

 

์„ธ ๊ฐœ์˜ ์ธ์ž ๊ฐ’์„ ์จ์„œ REPLACE ๋ฌธ์žฅ์„ ์จ๋ณด์•˜๋Š”๋ฐ ์ด๋ฒˆ์—๋„ INSERT ๋ฌธ์žฅ์ด ์‹คํ–‰๋˜์—ˆ๋‹ค

๊ทธ๋ž˜์„œ ๊ตฌ๋ฌธ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๊ฐ€? ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฌธ์žฅ์„ ์ด์šฉํ•ด๋ณด์•˜๋‹ค.

 

MariaDB [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> replace into membership values(...);

 

 

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋„ ๋˜‘๊ฐ™์ด ์ถ”๊ฐ€๊ฐ€ ๋˜๋Š” ํ˜•์‹์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค

๋ฌด์—‡์ธ๊ฐ€ ์ด์ƒํ•˜์—ฌ์„œ ์ฐพ์•„๋ณด์•˜๋”๋‹ˆ(https://mariadb.com/kb/en/mariadb/replace ์ฐธ๊ณ , 'Real MariaDB' ์ฑ…์—๋„ ์žˆ๋Š” ๋‚ด์šฉ) 'REPLACE๋Š” INSERT์™€ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘๋œ๋‹ค

primary key๋‚˜ uniqueํ‚ค๊ฐ€ ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋จผ์ € ๊ทธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋กœ insert๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.' ๋ผ๋Š” ์ „์ œ์กฐ๊ฑด์ด ์žˆ์—ˆ๋‹ค

๊ทธ๋Ÿฌ๋ฉด primary key๊ฐ€ ํฌํ•จ๋œ table์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ replace๋ฌธ์„ ์‹คํ–‰์‹œ์ผœ ๋ณด๋„๋ก ํ•˜์ž.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> create table (ํ…Œ์ด๋ธ” ์ด๋ฆ„) (

                      -> ๋ณ€์ˆ˜๋ช… varchar(ํฌ๊ธฐ),

                      -> constraint ๋ณ€์ˆ˜๋ช… primary key(๋ณ€์ˆ˜๋ช…),

                      -> ๋ณ€์ˆ˜๋ช… varchar(ํฌ๊ธฐ)

                      -> );

 

 

INSERT๋ฌธ์žฅ์„ ์ด์šฉํ•˜์—ฌ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์•„๊นŒ ์ „์˜ REPLACE ๋ฌธ์žฅ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด์ž.

 

 

์ƒ๊ฐํ•œ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค! REPLACE ๋ฌธ์žฅ์€ ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ INSERTํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ INSERT INTO ... ON DUPLICATE KEY UPDATE ... ๋ฌธ์žฅ๋ณด๋‹ค๋Š” ๋ถ€ํ•˜๋„ ๋†’๊ณ  ์‹œ์Šคํ…œ์˜ ์ž์›์„ ๋งŽ์ด ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค

๊ฐ€๋Šฅํ•œ๋Œ€๋กœ REPLACE๋ฌธ์žฅ ๋ณด๋‹ค๋Š” INSERT INTO ... ON DUPLICATE KEY UPDATE ... ๋ฌธ์žฅ์„ ์“ฐ๋„๋ก ํ•˜์ž.

 

3.5 DELETE

 

ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ DELETE๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> delete from (ํ…Œ์ด๋ธ” ์ด๋ฆ„) where table_id=5297734;

 

 

 

WHERE ์กฐ๊ฑด์ ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์กฐ๊ฑด์— ๋ถ€ํ•ฉ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ์„ ์‚ญ์ œํ•˜์ง€๋งŒ WHERE ์กฐ๊ฑด์ ˆ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

+ Recent posts