-- 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;