|
- -- 3D平訂伽邿佴艤
- local Move3DTool = class("Move3DTool", require("MoveTool"))
- function Move3DTool:ctor()
- self.super.ctor(self);
- self.factor = 1.0;
- self.startScreenPos = nil;
- end
-
- function Move3DTool:clear()
- self.super.clear(self);
- self.startScreenPos = nil;
- end
-
- function Move3DTool:MouseDown(button , x , y)
- if self.super.MouseDown(self, button, x, y) then
- self.startScreenPos = cc.p(x, y);
- end
- end
-
- function Move3DTool:convertScreenToWorldPos(mouseX, mouseY, planeNormal, planeDistance)
- local floorPlane = cc.Plane:new(planeNormal , planeDistance);
-
- -- 輪蹋远mainlayer謩藔蕨位變
- local screenSize = cc.Director:getInstance():getWinSizeInPixels();
- local ray = app.mainCamera:pickRay(mouseX / screenSize.width , mouseY / screenSize.height);
- local dist = ray:intersectsPlane(floorPlane);
- if dist >= 0 then
- return ray:getPoint(dist);
- else
- return ray:getPoint(0);
- end
- end
-
- function Move3DTool:moveTo(screenX, screenY)
- -- 斩
- local targetOffset;
- --[[local offset = cc.pSub(endPos , self.startPos);
- if app.cs.getModifierKeys() == Keys.Control then
- -- 只艤覙Y住蕪袀訂织
- targetOffset = cc.vec3(0, offset.y * self.factor, 0);
- else
- -- 諝XZ平摩蕪摩平訂
- targetOffset = cc.vec3(offset.x * self.factor, 0, offset.y * self.factor);
- end--]]
-
- -- Shift酄樧喲阶?
- if app.cs.getModifierKeys() == Keys.Shift then
- for i , v in pairs(self.originPoies) do
- local originWorld = v.rotate;
- i:setEulerRotation(originWorld.x , originWorld.y + (screenX - self.startScreenPos.x) , originWorld.z);
- end
- else
- for i , v in pairs(self.originPoies) do
- local originWorld = i:getParent():convertToWorldSpace(v.pos);
- if app.cs.getModifierKeys() == Keys.Control then
- -- 只艤覙Y住蕪袀訂织
- -- 顺要写袀时謩藔蕨位變
- local normal
- if originWorld.z > 0 then
- normal = cc.vec3(0,0,-1)
- else
- normal = cc.vec3(0,0,1)
- end
- local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.z);
- -- 毡前顺要謩藔蕨位變
- local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.z);
- targetOffset = cc.vec3(0, curWorldPos.y - downWorldPos.y, 0);
- else
- local normal
- if originWorld.y > 0 then
- normal = cc.vec3(0,-1,0)
- else
- normal = cc.vec3(0,1,0)
- end
- -- 顺要写袀时謩藔蕨位變
- local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.y);
- -- 毡前顺要謩藔蕨位變
- local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.y);
- targetOffset = cc.vec3(curWorldPos.x - downWorldPos.x, 0, curWorldPos.z - downWorldPos.z);
- end
-
- local newWorld = cc.vec3Add(originWorld , targetOffset);
- local newLocal = i:getParent():convertToNodeSpace(newWorld);
-
- i:setTranslation(newLocal);
- end
- end
- end
-
- function Move3DTool:commandMoveTo(screenX, screenY)
- local endPos = cc.p(screenX, screenY);
- -- 骚诨没詯注屎偏訂詹一穴要訂织
- if cc.pEqual(endPos, self.startPos) then
- return;
- end
-
- -- 通诮募庐4訂织
- local commands = {};
- -- 斩
- local targetOffset;
- if app.cs.getModifierKeys() == Keys.Shift then
- for i , v in pairs(self.originPoies) do
- local originWorld = v.rotate;
- local newLocal = cc.vec3(originWorld.x , originWorld.y + (screenX - self.startScreenPos.x) , originWorld.z);
- i:setEulerRotation(v.rotate);
- table.insert(commands, Commands:rotateNode(i, newLocal));
- end
- else
- for i , v in pairs(self.originPoies) do
- local originWorld = i:getParent():convertToWorldSpace(v.pos);
- if app.cs.getModifierKeys() == Keys.Control then
- -- 只艤覙Y住蕪袀訂织
- -- 顺要写袀时謩藔蕨位變
- local normal
- if originWorld.z > 0 then
- normal = cc.vec3(0,0,-1)
- else
- normal = cc.vec3(0,0,1)
- end
- local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.z);
- -- 毡前顺要謩藔蕨位變
- local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.z);
- targetOffset = cc.vec3(0, curWorldPos.y - downWorldPos.y, 0);
- else
- local normal
- if originWorld.y > 0 then
- normal = cc.vec3(0,-1,0)
- else
- normal = cc.vec3(0,1,0)
- end
- -- 顺要写袀时謩藔蕨位變
- local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.y);
- -- 毡前顺要謩藔蕨位變
- local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.y);
- targetOffset = cc.vec3(curWorldPos.x - downWorldPos.x, 0, curWorldPos.z - downWorldPos.z);
- end
-
- local newWorld = cc.vec3Add(originWorld , targetOffset);
- local newLocal = i:getParent():convertToNodeSpace(newWorld);
-
- i:setTranslation(v.pos);
- table.insert(commands, Commands:moveNode(i, newLocal));
- end
- end
-
- app.undoRedoManager:doCommand(Commands:batchCommand(commands));
- end
-
- function Move3DTool:commandMoveBy(offset)
- -- 骚诨没詯注屎偏訂詹一穴要訂织
- if cc.pEqual(offset, {x = 0, y = 0}) then
- return;
- end
-
- -- 斩
- local targetOffset = cc.vec3(offset.x, 0, offset.y);
-
- -- 通诮募庐4訂织
- local commands = {};
- for i , v in pairs(app.editor.SelectedNodes) do
- local originWorld = v:getParent():convertToWorldSpace(v:getPosition());
- local newWorld = cc.vec3Add(originWorld , targetOffset);
- local newLocal = v:getParent():convertToNodeSpace(newWorld);
-
- table.insert(commands, Commands:moveNode(v, newLocal));
- end
-
- app.undoRedoManager:doCommand(Commands:batchCommand(commands));
- end
-
- return Move3DTool;
|